diff options
author | Jason Ekstrand <[email protected]> | 2019-04-16 17:35:05 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-04-19 19:56:42 +0000 |
commit | a5a0dc08f18928a080e3393ebc694bc7053216fb (patch) | |
tree | b3e74a891230ede9486d391c2c422c37290218ce | |
parent | 3b755b52e80acc7705775ccaf5f31cf213edb207 (diff) |
anv: Add a #define for the max binding table size
This also fixes a bug where we mis-calculate maximum binding table sizes
and may return true in vkGetDescriptorSetLayoutSupport even for sets too
large to fit in a binding table.
Fixes: ddc40691221 "anv: Implement VK_KHR_maintenance3"
Reviewed-by: Caio Marcelo de Oliveira Filho <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_descriptor_set.c | 6 | ||||
-rw-r--r-- | src/intel/vulkan/anv_device.c | 2 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 12 |
3 files changed, 16 insertions, 4 deletions
diff --git a/src/intel/vulkan/anv_descriptor_set.c b/src/intel/vulkan/anv_descriptor_set.c index fa1d042f792..004d3f2f77f 100644 --- a/src/intel/vulkan/anv_descriptor_set.c +++ b/src/intel/vulkan/anv_descriptor_set.c @@ -163,10 +163,10 @@ void anv_GetDescriptorSetLayoutSupport( bool supported = true; for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) { - /* Our maximum binding table size is 250 and we need to reserve 8 for - * render targets. 240 is a nice round number. + /* Our maximum binding table size is 240 and we need to reserve 8 for + * render targets. */ - if (surface_count[s] >= 240) + if (surface_count[s] >= MAX_BINDING_TABLE_SIZE - MAX_RTS) supported = false; } diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index bc51c2c1aab..71de8865986 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1121,7 +1121,7 @@ void anv_GetPhysicalDeviceProperties( .maxPerStageDescriptorSampledImages = max_samplers, .maxPerStageDescriptorStorageImages = MAX_IMAGES, .maxPerStageDescriptorInputAttachments = 64, - .maxPerStageResources = 250, + .maxPerStageResources = MAX_BINDING_TABLE_SIZE - MAX_RTS, .maxDescriptorSetSamplers = 6 * max_samplers, /* number of stages * maxPerStageDescriptorSamplers */ .maxDescriptorSetUniformBuffers = 6 * 64, /* number of stages * maxPerStageDescriptorUniformBuffers */ .maxDescriptorSetUniformBuffersDynamic = MAX_DYNAMIC_BUFFERS / 2, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 28854411b11..5ae71b4e8c4 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -162,6 +162,18 @@ struct gen_l3_config; #define MAX_INLINE_UNIFORM_BLOCK_SIZE 4096 #define MAX_INLINE_UNIFORM_BLOCK_DESCRIPTORS 32 +/* From the Skylake PRM Vol. 7 "Binding Table Surface State Model": + * + * "The surface state model is used when a Binding Table Index (specified + * in the message descriptor) of less than 240 is specified. In this model, + * the Binding Table Index is used to index into the binding table, and the + * binding table entry contains a pointer to the SURFACE_STATE." + * + * Binding table values above 240 are used for various things in the hardware + * such as stateless, stateless with incoherent cache, SLM, and bindless. + */ +#define MAX_BINDING_TABLE_SIZE 240 + /* The kernel relocation API has a limitation of a 32-bit delta value * applied to the address before it is written which, in spite of it being * unsigned, is treated as signed . Because of the way that this maps to |