display: Allow passing whole state into dispatch_compute()

This is mainly useful for unit testing
This commit is contained in:
rdb 2024-08-23 12:17:07 +02:00
parent babd3a070d
commit 76ffef38d1
3 changed files with 19 additions and 5 deletions

View File

@ -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);
}

View File

@ -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();

View File

@ -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();