diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-09-17 15:38:40 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-09-18 09:49:54 +0200 |
commit | 8fe16fef283d281454d575829c2411ec923a5c8b (patch) | |
tree | 4bebd4a80c8d78776f14cc16ab4d79f16caa9dda /src/gui/rhi/qrhigles2.cpp | |
parent | 6f2c7469f86785e6ba81fe0280210ef7275099de (diff) |
rhi: Expose compute threadgroup limits in ResourceLimits
As OpenGL ES and Vulkan ruin the day with the spec mandated minimum
value for max threads per threadgroup being only 128, clients need
a way to decide if their compute shader (local_size_*) is suitable
for use at run time.
Change-Id: I72b4fc97032406340623add82ea4d9544ebe9fdc
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/gui/rhi/qrhigles2.cpp')
-rw-r--r-- | src/gui/rhi/qrhigles2.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 72a8cc539b..4440182264 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -301,6 +301,18 @@ QT_BEGIN_NAMESPACE #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #endif +#ifndef GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#endif + +#ifndef GL_MAX_COMPUTE_WORK_GROUP_COUNT +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#endif + +#ifndef GL_MAX_COMPUTE_WORK_GROUP_SIZE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#endif + /*! Constructs a new QRhiGles2InitParams. @@ -514,6 +526,18 @@ bool QRhiGles2::create(QRhi::Flags flags) else caps.compute = caps.ctxMajor > 4 || (caps.ctxMajor == 4 && caps.ctxMinor >= 3); // 4.3 + if (caps.compute) { + f->glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &caps.maxThreadsPerThreadGroup); + GLint tgPerDim[3]; + f->glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &tgPerDim[0]); + f->glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &tgPerDim[1]); + f->glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &tgPerDim[2]); + caps.maxThreadGroupsPerDimension = qMin(tgPerDim[0], qMin(tgPerDim[1], tgPerDim[2])); + f->glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &caps.maxThreadGroupsX); + f->glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &caps.maxThreadGroupsY); + f->glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &caps.maxThreadGroupsZ); + } + if (caps.gles) caps.textureCompareMode = caps.ctxMajor >= 3; // ES 3.0 else @@ -931,6 +955,16 @@ int QRhiGles2::resourceLimit(QRhi::ResourceLimit limit) const return 1; case QRhi::MaxAsyncReadbackFrames: return 1; + case QRhi::MaxThreadGroupsPerDimension: + return caps.maxThreadGroupsPerDimension; + case QRhi::MaxThreadsPerThreadGroup: + return caps.maxThreadsPerThreadGroup; + case QRhi::MaxThreadGroupX: + return caps.maxThreadGroupsX; + case QRhi::MaxThreadGroupY: + return caps.maxThreadGroupsY; + case QRhi::MaxThreadGroupZ: + return caps.maxThreadGroupsZ; default: Q_UNREACHABLE(); return 0; |