#include <msp/gl/extensions/arb_explicit_uniform_location.h>
#include <msp/gl/extensions/arb_gpu_shader5.h>
#include <msp/gl/extensions/arb_separate_shader_objects.h>
+#include <msp/gl/extensions/arb_shader_image_load_store.h>
#include <msp/gl/extensions/arb_uniform_buffer_object.h>
#include <msp/gl/extensions/arb_vertex_shader.h>
#include <msp/gl/extensions/ext_framebuffer_multisample.h>
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, reinterpret_cast<int *>(&lim.max_vertex_attributes));
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, reinterpret_cast<int *>(&lim.max_texture_bindings));
}
+ if(ARB_shader_image_load_store)
+ glGetIntegerv(GL_MAX_IMAGE_UNITS, reinterpret_cast<int *>(&lim.max_storage_texture_bindings));
if(EXT_framebuffer_object)
glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, reinterpret_cast<int *>(&lim.max_color_attachments));
if(EXT_framebuffer_multisample)
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);
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)
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)
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");
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);
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<const ImageTypeDeclaration *>(base_type)->sampled ?
+ features.texture_binding_range : features.storage_texture_binding_range);
+ bind_uniform(t->layout, t->name, range);
+ }
}
void LocationAllocator::apply(Stage &stage)