diff options
-rw-r--r-- | src/intel/vulkan/anv_device.c | 7 | ||||
-rw-r--r-- | src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 4 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 5 | ||||
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 25 |
4 files changed, 28 insertions, 13 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 85212074385..add0c498ac2 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -987,9 +987,12 @@ void anv_GetPhysicalDeviceProperties( const uint32_t max_samplers = (devinfo->gen >= 8 || devinfo->is_haswell) ? 128 : 16; + const uint32_t max_images = devinfo->gen < 9 ? MAX_GEN8_IMAGES : MAX_IMAGES; + VkSampleCountFlags sample_counts = isl_device_get_sample_counts(&pdevice->isl_dev); + VkPhysicalDeviceLimits limits = { .maxImageDimension1D = (1 << 14), .maxImageDimension2D = (1 << 14), @@ -1009,7 +1012,7 @@ void anv_GetPhysicalDeviceProperties( .maxPerStageDescriptorUniformBuffers = 64, .maxPerStageDescriptorStorageBuffers = 64, .maxPerStageDescriptorSampledImages = max_samplers, - .maxPerStageDescriptorStorageImages = 64, + .maxPerStageDescriptorStorageImages = max_images, .maxPerStageDescriptorInputAttachments = 64, .maxPerStageResources = 250, .maxDescriptorSetSamplers = 6 * max_samplers, /* number of stages * maxPerStageDescriptorSamplers */ @@ -1018,7 +1021,7 @@ void anv_GetPhysicalDeviceProperties( .maxDescriptorSetStorageBuffers = 6 * 64, /* number of stages * maxPerStageDescriptorStorageBuffers */ .maxDescriptorSetStorageBuffersDynamic = MAX_DYNAMIC_BUFFERS / 2, .maxDescriptorSetSampledImages = 6 * max_samplers, /* number of stages * maxPerStageDescriptorSampledImages */ - .maxDescriptorSetStorageImages = 6 * 64, /* number of stages * maxPerStageDescriptorStorageImages */ + .maxDescriptorSetStorageImages = 6 * max_images, /* number of stages * maxPerStageDescriptorStorageImages */ .maxDescriptorSetInputAttachments = 256, .maxVertexInputAttributes = MAX_VBS, .maxVertexInputBindings = MAX_VBS, diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index b3daf702bc0..623984b0f8c 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -528,8 +528,8 @@ anv_nir_apply_pipeline_layout(const struct anv_physical_device *pdevice, } } - if (map->image_count > 0) { - assert(map->image_count <= MAX_IMAGES); + if (map->image_count > 0 && pdevice->compiler->devinfo->gen < 9) { + assert(map->image_count <= MAX_GEN8_IMAGES); assert(shader->num_uniforms == prog_data->nr_params * 4); state.first_image_uniform = shader->num_uniforms; uint32_t *param = brw_stage_prog_data_add_params(prog_data, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index aaa17a68241..617f4e0f152 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -157,7 +157,8 @@ struct gen_l3_config; #define MAX_SCISSORS 16 #define MAX_PUSH_CONSTANTS_SIZE 128 #define MAX_DYNAMIC_BUFFERS 16 -#define MAX_IMAGES 8 +#define MAX_IMAGES 64 +#define MAX_GEN8_IMAGES 8 #define MAX_PUSH_DESCRIPTORS 32 /* Minimum requirement */ /* The kernel relocation API has a limitation of a 32-bit delta value @@ -1883,7 +1884,7 @@ struct anv_push_constants { uint32_t base_work_group_id[3]; /* Image data for image_load_store on pre-SKL */ - struct brw_image_param images[MAX_IMAGES]; + struct brw_image_param images[MAX_GEN8_IMAGES]; }; struct anv_dynamic_state { diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 03ea91aa0f9..0bf46db0a5e 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2006,6 +2006,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, gl_shader_stage stage, struct anv_state *bt_state) { + const struct gen_device_info *devinfo = &cmd_buffer->device->info; struct anv_subpass *subpass = cmd_buffer->state.subpass; struct anv_cmd_pipeline_state *pipe_state; struct anv_pipeline *pipeline; @@ -2063,7 +2064,8 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, if (map->surface_count == 0) goto out; - if (map->image_count > 0) { + /* We only use push constant space for images before gen9 */ + if (map->image_count > 0 && devinfo->gen < 9) { VkResult result = anv_cmd_buffer_ensure_push_constant_field(cmd_buffer, stage, images); if (result != VK_SUCCESS) @@ -2176,11 +2178,16 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, surface_state = sstate.state; assert(surface_state.alloc_size); add_surface_state_relocs(cmd_buffer, sstate); + image++; - struct brw_image_param *image_param = - &cmd_buffer->state.push_constants[stage]->images[image++]; + if (devinfo->gen < 9) { + assert(image < MAX_GEN8_IMAGES); + struct brw_image_param *image_param = + &cmd_buffer->state.push_constants[stage]->images[image]; - *image_param = desc->image_view->planes[binding->plane].storage_image_param; + *image_param = + desc->image_view->planes[binding->plane].storage_image_param; + } break; } @@ -2225,11 +2232,15 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, assert(surface_state.alloc_size); add_surface_reloc(cmd_buffer, surface_state, desc->buffer_view->address); + image++; - struct brw_image_param *image_param = - &cmd_buffer->state.push_constants[stage]->images[image++]; + if (devinfo->gen < 9) { + assert(image < MAX_GEN8_IMAGES); + struct brw_image_param *image_param = + &cmd_buffer->state.push_constants[stage]->images[image]; - *image_param = desc->buffer_view->storage_image_param; + *image_param = desc->buffer_view->storage_image_param; + } break; default: |