v3dv/uniforms: handle texture size for texel buffers
This gets tests like the following one working:
dEQP-VK.image.image_size.buffer.readonly_writeonly_1
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c
index cca4490..b162e2c 100644
--- a/src/broadcom/vulkan/v3dv_uniforms.c
+++ b/src/broadcom/vulkan/v3dv_uniforms.c
@@ -227,26 +227,10 @@
}
static uint32_t
-get_texture_size(struct v3dv_cmd_buffer *cmd_buffer,
- struct v3dv_pipeline *pipeline,
- enum quniform_contents contents,
- uint32_t data)
+get_texture_size_from_image_view(struct v3dv_image_view *image_view,
+ enum quniform_contents contents,
+ uint32_t data)
{
- int unit = v3d_unit_data_get_unit(data);
- uint32_t texture_idx;
- struct v3dv_descriptor_state *descriptor_state =
- &cmd_buffer->state.descriptor_state[v3dv_pipeline_get_binding_point(pipeline)];
-
- v3dv_pipeline_combined_index_key_unpack(pipeline->combined_index_to_key_map[unit],
- &texture_idx,
- NULL);
-
- struct v3dv_image_view *image_view =
- v3dv_descriptor_map_get_image_view(descriptor_state, &pipeline->texture_map,
- pipeline->layout, texture_idx);
-
- assert(image_view);
-
switch(contents) {
case QUNIFORM_IMAGE_WIDTH:
case QUNIFORM_TEXTURE_WIDTH:
@@ -275,6 +259,61 @@
}
}
+
+static uint32_t
+get_texture_size_from_buffer_view(struct v3dv_buffer_view *buffer_view,
+ enum quniform_contents contents,
+ uint32_t data)
+{
+ switch(contents) {
+ case QUNIFORM_IMAGE_WIDTH:
+ case QUNIFORM_TEXTURE_WIDTH:
+ return buffer_view->num_elements;
+ /* Only size can be queried for texel buffers */
+ default:
+ unreachable("Bad texture size field for texel buffers");
+ }
+}
+
+static uint32_t
+get_texture_size(struct v3dv_cmd_buffer *cmd_buffer,
+ struct v3dv_pipeline *pipeline,
+ enum quniform_contents contents,
+ uint32_t data)
+{
+ int unit = v3d_unit_data_get_unit(data);
+ uint32_t texture_idx;
+ struct v3dv_descriptor_state *descriptor_state =
+ &cmd_buffer->state.descriptor_state[v3dv_pipeline_get_binding_point(pipeline)];
+
+ v3dv_pipeline_combined_index_key_unpack(pipeline->combined_index_to_key_map[unit],
+ &texture_idx,
+ NULL);
+
+ struct v3dv_descriptor *descriptor =
+ v3dv_descriptor_map_get_descriptor(descriptor_state,
+ &pipeline->texture_map,
+ pipeline->layout,
+ texture_idx, NULL);
+
+ assert(descriptor);
+
+ switch (descriptor->type) {
+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
+ case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
+ return get_texture_size_from_image_view(descriptor->image_view,
+ contents, data);
+ case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
+ case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
+ return get_texture_size_from_buffer_view(descriptor->buffer_view,
+ contents, data);
+ default:
+ unreachable("Wrong descriptor for getting texture size");
+ }
+}
+
struct v3dv_cl_reloc
v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_buffer,
struct v3dv_pipeline_stage *p_stage,