|
@@ -1185,15 +1185,16 @@ extract_texture_data(Texture *tex, GraphicsStateGuardian *gsg) {
|
|
|
* The return value is true if the operation is successful, false otherwise.
|
|
* The return value is true if the operation is successful, false otherwise.
|
|
|
*/
|
|
*/
|
|
|
void GraphicsEngine::
|
|
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();
|
|
const Shader *shader = sattr->get_shader();
|
|
|
nassertv(shader != nullptr);
|
|
nassertv(shader != nullptr);
|
|
|
nassertv(gsg != nullptr);
|
|
nassertv(gsg != nullptr);
|
|
|
|
|
|
|
|
ReMutexHolder holder(_lock);
|
|
ReMutexHolder holder(_lock);
|
|
|
|
|
|
|
|
- CPT(RenderState) state = RenderState::make(sattr);
|
|
|
|
|
-
|
|
|
|
|
string draw_name = gsg->get_threading_model().get_draw_name();
|
|
string draw_name = gsg->get_threading_model().get_draw_name();
|
|
|
if (draw_name.empty()) {
|
|
if (draw_name.empty()) {
|
|
|
// A single-threaded environment. No problem.
|
|
// 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.
|
|
// Now that the draw thread is idle, signal it to do the compute task.
|
|
|
thread->_gsg = gsg;
|
|
thread->_gsg = gsg;
|
|
|
- thread->_state = state.p();
|
|
|
|
|
|
|
+ thread->_state = state;
|
|
|
thread->_work_groups = work_groups;
|
|
thread->_work_groups = work_groups;
|
|
|
thread->_thread_state = TS_do_compute;
|
|
thread->_thread_state = TS_do_compute;
|
|
|
thread->_cv_mutex.release();
|
|
thread->_cv_mutex.release();
|