mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Fix] (MG_Impl/GLImpl): report compute shader minimum limits [skip ci]
This commit is contained in:
@@ -39,7 +39,9 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
|
|
||||||
constexpr GLint kFrontendMaxComputeUniformComponents = 1024;
|
constexpr GLint kFrontendMaxComputeUniformComponents = 1024;
|
||||||
constexpr GLint kFrontendMaxComputeAtomicCounters = 8;
|
constexpr GLint kFrontendMaxComputeAtomicCounters = 8;
|
||||||
constexpr GLint kFrontendMaxComputeAtomicCounterBuffers = 1;
|
constexpr GLint kFrontendMaxComputeAtomicCounterBuffers = 8;
|
||||||
|
constexpr GLint kFrontendMaxComputeSharedMemorySize = 32768;
|
||||||
|
constexpr GLint kFrontendMaxComputeWorkGroupInvocations = 1024;
|
||||||
constexpr GLint kFrontendMaxCombinedAtomicCounters = 8;
|
constexpr GLint kFrontendMaxCombinedAtomicCounters = 8;
|
||||||
constexpr GLint kFrontendMaxFragmentAtomicCounters = 8;
|
constexpr GLint kFrontendMaxFragmentAtomicCounters = 8;
|
||||||
constexpr GLint kFrontendMaxGeometryAtomicCounters = 0;
|
constexpr GLint kFrontendMaxGeometryAtomicCounters = 0;
|
||||||
@@ -75,6 +77,14 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
constexpr GLint kFrontendSubpixelBits = 4;
|
constexpr GLint kFrontendSubpixelBits = 4;
|
||||||
constexpr GLint kFrontendMaxSamples = 4;
|
constexpr GLint kFrontendMaxSamples = 4;
|
||||||
|
|
||||||
|
constexpr GLint GetMinComputeWorkGroupCount(GLuint index) {
|
||||||
|
return index < 3 ? 65535 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr GLint GetMinComputeWorkGroupSize(GLuint index) {
|
||||||
|
return index < 2 ? 1024 : (index == 2 ? 64 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
GLint GetMaxCombinedUniformComponents(GLint maxDefaultUniformComponents, GLint maxUniformBlocks,
|
GLint GetMaxCombinedUniformComponents(GLint maxDefaultUniformComponents, GLint maxUniformBlocks,
|
||||||
GLint maxUniformBlockSizeBytes) {
|
GLint maxUniformBlockSizeBytes) {
|
||||||
return maxDefaultUniformComponents + maxUniformBlocks * (maxUniformBlockSizeBytes / 4);
|
return maxDefaultUniformComponents + maxUniformBlocks * (maxUniformBlockSizeBytes / 4);
|
||||||
@@ -622,6 +632,27 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto getIntegeri = MG_Backend::gBackendFunctionsTable.GL.GetIntegeri_v;
|
auto getIntegeri = MG_Backend::gBackendFunctionsTable.GL.GetIntegeri_v;
|
||||||
|
if (target == GL_MAX_COMPUTE_WORK_GROUP_COUNT || target == GL_MAX_COMPUTE_WORK_GROUP_SIZE) {
|
||||||
|
if (index >= 3) {
|
||||||
|
*data = 0;
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidValue,
|
||||||
|
MakeUnique<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
|
"Compute work group index is out of range."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GLint minimum = target == GL_MAX_COMPUTE_WORK_GROUP_COUNT
|
||||||
|
? GetMinComputeWorkGroupCount(index)
|
||||||
|
: GetMinComputeWorkGroupSize(index);
|
||||||
|
GLint backendValue = 0;
|
||||||
|
if (getIntegeri) {
|
||||||
|
getIntegeri(target, index, &backendValue);
|
||||||
|
}
|
||||||
|
*data = std::max(backendValue, minimum);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!getIntegeri) {
|
if (!getIntegeri) {
|
||||||
*data = 0;
|
*data = 0;
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
@@ -848,6 +879,9 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
|
case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
|
||||||
*params = kFrontendMaxComputeAtomicCounterBuffers;
|
*params = kFrontendMaxComputeAtomicCounterBuffers;
|
||||||
return;
|
return;
|
||||||
|
case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
|
||||||
|
*params = kFrontendMaxComputeSharedMemorySize;
|
||||||
|
return;
|
||||||
case GL_DISPATCH_INDIRECT_BUFFER_BINDING: {
|
case GL_DISPATCH_INDIRECT_BUFFER_BINDING: {
|
||||||
auto& obj = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DispatchIndirect).GetBoundObject();
|
auto& obj = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DispatchIndirect).GetBoundObject();
|
||||||
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
|
*params = obj ? static_cast<GLint>(obj->GetExternalIndex()) : 0;
|
||||||
@@ -1604,7 +1638,8 @@ namespace MobileGL::MG_Impl::GLImpl {
|
|||||||
dynamicParameters.MaxUniformBlockSize);
|
dynamicParameters.MaxUniformBlockSize);
|
||||||
break;
|
break;
|
||||||
case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
|
case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
|
||||||
*params = dynamicParameters.MaxComputeWorkGroupInvocations;
|
*params = std::max(dynamicParameters.MaxComputeWorkGroupInvocations,
|
||||||
|
kFrontendMaxComputeWorkGroupInvocations);
|
||||||
break;
|
break;
|
||||||
case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
|
case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
|
||||||
GetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, ¶ms[0]);
|
GetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, ¶ms[0]);
|
||||||
|
|||||||
Reference in New Issue
Block a user