From: Mikko Rasa Date: Fri, 15 Apr 2022 19:44:25 +0000 (+0300) Subject: Add a separate limit for storage texture binding range X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=569772f;p=libs%2Fgl.git Add a separate limit for storage texture binding range --- diff --git a/source/backends/opengl/device_backend.cpp b/source/backends/opengl/device_backend.cpp index 7819c98f..db711e51 100644 --- a/source/backends/opengl/device_backend.cpp +++ b/source/backends/opengl/device_backend.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -62,6 +63,8 @@ void OpenGLDevice::fill_info() glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, reinterpret_cast(&lim.max_vertex_attributes)); glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, reinterpret_cast(&lim.max_texture_bindings)); } + if(ARB_shader_image_load_store) + glGetIntegerv(GL_MAX_IMAGE_UNITS, reinterpret_cast(&lim.max_storage_texture_bindings)); if(EXT_framebuffer_object) glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, reinterpret_cast(&lim.max_color_attachments)); if(EXT_framebuffer_multisample) @@ -87,6 +90,7 @@ void OpenGLDevice::fill_info() feat.ext_texture_array = EXT_texture_array; feat.uniform_binding_range = lim.max_uniform_bindings; feat.texture_binding_range = lim.max_texture_bindings; + feat.storage_texture_binding_range = lim.max_storage_texture_bindings; state.bound_tex_targets.resize(lim.max_texture_bindings); state.bound_uniform_blocks.resize(lim.max_uniform_bindings); diff --git a/source/backends/vulkan/device_backend.cpp b/source/backends/vulkan/device_backend.cpp index 9a8b930d..8e3f2ab6 100644 --- a/source/backends/vulkan/device_backend.cpp +++ b/source/backends/vulkan/device_backend.cpp @@ -56,6 +56,7 @@ void VulkanDevice::fill_info() limits.max_clip_planes = props.limits.maxClipDistances; limits.max_vertex_attributes = props.limits.maxVertexInputAttributes; limits.max_texture_bindings = props.limits.maxDescriptorSetSampledImages; + limits.max_storage_texture_bindings = props.limits.maxDescriptorSetStorageImages; limits.max_color_attachments = props.limits.maxColorAttachments; unsigned samples = props.limits.framebufferColorSampleCounts&props.limits.framebufferDepthSampleCounts&props.limits.framebufferStencilSampleCounts; if(samples&VK_SAMPLE_COUNT_64_BIT) diff --git a/source/glsl/features.cpp b/source/glsl/features.cpp index 9382ce66..d66226e3 100644 --- a/source/glsl/features.cpp +++ b/source/glsl/features.cpp @@ -34,6 +34,7 @@ Features Features::from_api_version(GraphicsApi api, const Version &ver) ver>=Version(3, 3) ? 36 : 24); features.texture_binding_range = (ver>=Version(4, 3) ? 96 : ver>=Version(4, 0) ? 80 : ver>=Version(3, 2) ? 48 : ver>=Version(1, 4) ? 32 : 16); + features.storage_texture_binding_range = 8; break; case OPENGL_ES: if(ver.major==2) @@ -52,11 +53,13 @@ Features Features::from_api_version(GraphicsApi api, const Version &ver) features.uniform_binding_range = (ver>=Version(3, 2) ? 72 : ver>=Version(3, 1) ? 36 : 24); features.texture_binding_range = (ver>=Version(3, 2) ? 96 : ver>=Version(3, 1) ? 48 : ver>=Version(3, 0) ? 32 : 8); + features.storage_texture_binding_range = 4; break; case VULKAN: features.glsl_version = Version(4, 60); features.uniform_binding_range = 72; features.texture_binding_range = 96; + features.storage_texture_binding_range = 24; break; default: throw invalid_argument("Features::from_api_version"); diff --git a/source/glsl/features.h b/source/glsl/features.h index e0d7dd77..28cefd0b 100644 --- a/source/glsl/features.h +++ b/source/glsl/features.h @@ -22,6 +22,7 @@ struct Features unsigned constant_id_range = 0x80000000U; unsigned uniform_binding_range = 24; unsigned texture_binding_range = 16; + unsigned storage_texture_binding_range = 8; static Features from_api_version(GraphicsApi, const Version &); static Features latest(GraphicsApi); diff --git a/source/glsl/finalize.cpp b/source/glsl/finalize.cpp index 94052432..3b0909ac 100644 --- a/source/glsl/finalize.cpp +++ b/source/glsl/finalize.cpp @@ -75,7 +75,12 @@ void LocationAllocator::apply(Module &module, const Features &f, bool a) for(VariableDeclaration *b: unbound_blocks) bind_uniform(b->layout, b->block_declaration->block_name, features.uniform_binding_range); for(VariableDeclaration *t: unbound_textures) - bind_uniform(t->layout, t->name, features.texture_binding_range); + { + const TypeDeclaration *base_type = get_ultimate_base_type(t->type_declaration); + unsigned range = (static_cast(base_type)->sampled ? + features.texture_binding_range : features.storage_texture_binding_range); + bind_uniform(t->layout, t->name, range); + } } void LocationAllocator::apply(Stage &stage)