Add compute dispatch limit;

This commit is contained in:
bjorn 2020-09-17 19:42:54 -07:00
parent 4f730a89a7
commit c7ca7eaa38
3 changed files with 18 additions and 1 deletions

View File

@ -451,6 +451,14 @@ static int l_lovrGraphicsGetLimits(lua_State* L) {
lua_setfield(L, -2, "anisotropy"); lua_setfield(L, -2, "anisotropy");
lua_pushinteger(L, limits->blockSize); lua_pushinteger(L, limits->blockSize);
lua_setfield(L, -2, "blocksize"); lua_setfield(L, -2, "blocksize");
lua_createtable(L, 3, 0);
lua_pushinteger(L, limits->compute[0]);
lua_rawseti(L, -2, 1);
lua_pushinteger(L, limits->compute[1]);
lua_rawseti(L, -2, 2);
lua_pushinteger(L, limits->compute[2]);
lua_rawseti(L, -2, 3);
lua_setfield(L, -2, "compute");
return 1; return 1;
} }

View File

@ -189,13 +189,13 @@ typedef struct {
} GpuFeatures; } GpuFeatures;
typedef struct { typedef struct {
bool initialized;
float pointSizes[2]; float pointSizes[2];
int textureSize; int textureSize;
int textureMSAA; int textureMSAA;
float textureAnisotropy; float textureAnisotropy;
int blockSize; int blockSize;
int blockAlign; int blockAlign;
int compute[3];
} GpuLimits; } GpuLimits;
typedef struct { typedef struct {

View File

@ -1263,6 +1263,12 @@ void lovrGpuInit(void* (*getProcAddress)(const char*), bool debug) {
#endif #endif
glGetFloatv(GL_POINT_SIZE_RANGE, state.limits.pointSizes); glGetFloatv(GL_POINT_SIZE_RANGE, state.limits.pointSizes);
if (state.features.compute) {
glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &state.limits.compute[0]);
glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &state.limits.compute[1]);
glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &state.limits.compute[2]);
}
if (state.features.multiview) { if (state.features.multiview) {
state.singlepass = MULTIVIEW; state.singlepass = MULTIVIEW;
} else if (state.features.instancedStereo) { } else if (state.features.instancedStereo) {
@ -1395,6 +1401,9 @@ void lovrGpuCompute(Shader* shader, int x, int y, int z) {
#else #else
lovrAssert(state.features.compute, "Compute shaders are not supported on this system"); lovrAssert(state.features.compute, "Compute shaders are not supported on this system");
lovrAssert(shader->type == SHADER_COMPUTE, "Attempt to use a non-compute shader for a compute operation"); lovrAssert(shader->type == SHADER_COMPUTE, "Attempt to use a non-compute shader for a compute operation");
lovrAssert(x <= state.limits.compute[0], "Compute x size %d exceeds the maximum of %d", state.limits.compute[0]);
lovrAssert(y <= state.limits.compute[1], "Compute y size %d exceeds the maximum of %d", state.limits.compute[1]);
lovrAssert(z <= state.limits.compute[2], "Compute z size %d exceeds the maximum of %d", state.limits.compute[2]);
lovrGraphicsFlush(); lovrGraphicsFlush();
lovrGpuBindShader(shader); lovrGpuBindShader(shader);
glDispatchCompute(x, y, z); glDispatchCompute(x, y, z);