From 76ffef38d106079904f102ff7f40fa5816f6d869 Mon Sep 17 00:00:00 2001 From: rdb Date: Fri, 23 Aug 2024 12:17:07 +0200 Subject: [PATCH] display: Allow passing whole state into dispatch_compute() This is mainly useful for unit testing --- panda/src/display/graphicsEngine.I | 9 +++++++++ panda/src/display/graphicsEngine.cxx | 9 +++++---- panda/src/display/graphicsEngine.h | 6 +++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/panda/src/display/graphicsEngine.I b/panda/src/display/graphicsEngine.I index d0a4769a21..e9fc42ce44 100644 --- a/panda/src/display/graphicsEngine.I +++ b/panda/src/display/graphicsEngine.I @@ -162,3 +162,12 @@ make_parasite(GraphicsOutput *host, const std::string &name, host->get_gsg(), host); return result; } + +/** + * Version of dispatch_compute that takes a ShaderAttrib instead of a full + * RenderState. + */ +INLINE void GraphicsEngine:: +dispatch_compute(const LVecBase3i &work_groups, const ShaderAttrib *sattr, GraphicsStateGuardian *gsg) { + dispatch_compute(work_groups, RenderState::make(sattr), gsg); +} diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 0a346e8473..27b8c2bf28 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -1185,15 +1185,16 @@ extract_texture_data(Texture *tex, GraphicsStateGuardian *gsg) { * The return value is true if the operation is successful, false otherwise. */ void GraphicsEngine:: -dispatch_compute(const LVecBase3i &work_groups, const ShaderAttrib *sattr, GraphicsStateGuardian *gsg) { +dispatch_compute(const LVecBase3i &work_groups, const RenderState *state, GraphicsStateGuardian *gsg) { + const ShaderAttrib *sattr; + DCAST_INTO_V(sattr, state->get_attrib(ShaderAttrib::get_class_slot())); + const Shader *shader = sattr->get_shader(); nassertv(shader != nullptr); nassertv(gsg != nullptr); ReMutexHolder holder(_lock); - CPT(RenderState) state = RenderState::make(sattr); - string draw_name = gsg->get_threading_model().get_draw_name(); if (draw_name.empty()) { // A single-threaded environment. No problem. @@ -1220,7 +1221,7 @@ dispatch_compute(const LVecBase3i &work_groups, const ShaderAttrib *sattr, Graph // Now that the draw thread is idle, signal it to do the compute task. thread->_gsg = gsg; - thread->_state = state.p(); + thread->_state = state; thread->_work_groups = work_groups; thread->_thread_state = TS_do_compute; thread->_cv_mutex.release(); diff --git a/panda/src/display/graphicsEngine.h b/panda/src/display/graphicsEngine.h index 0614e47b79..f0ebeb5a66 100644 --- a/panda/src/display/graphicsEngine.h +++ b/panda/src/display/graphicsEngine.h @@ -32,6 +32,7 @@ #include "indirectLess.h" #include "loader.h" #include "referenceCount.h" +#include "renderState.h" class Pipeline; class DisplayRegion; @@ -111,8 +112,11 @@ PUBLISHED: bool extract_texture_data(Texture *tex, GraphicsStateGuardian *gsg); void dispatch_compute(const LVecBase3i &work_groups, - const ShaderAttrib *sattr, + const RenderState *state, GraphicsStateGuardian *gsg); + INLINE void dispatch_compute(const LVecBase3i &work_groups, + const ShaderAttrib *sattr, + GraphicsStateGuardian *gsg); static GraphicsEngine *get_global_ptr();