summaryrefslogtreecommitdiff
path: root/src/broadcom
diff options
context:
space:
mode:
authorAlejandro PiƱeiro <apinheiro@igalia.com>2020-04-11 14:54:30 +0200
committerMarge Bot <eric+marge@anholt.net>2020-10-13 21:21:29 +0000
commitb94946c23bab2cfceaf3101cb10f8e517a359122 (patch)
treeb624f802d4731bf59a7dd1155796c4cf56daf84c /src/broadcom
parent9b98d3652283cf986380ffe574523c2ef2eedba8 (diff)
v3dv/uniforms: fill up texture size-related uniforms
Needed for textureQueryLevels and textureSize Gets tests like the following working: dEQP-VK.glsl.texture_functions.query.texturequerylevels.isampler2d_fragment Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
Diffstat (limited to 'src/broadcom')
-rw-r--r--src/broadcom/vulkan/v3dv_uniforms.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c
index 83268bf6b86..e5ca9cc69d9 100644
--- a/src/broadcom/vulkan/v3dv_uniforms.c
+++ b/src/broadcom/vulkan/v3dv_uniforms.c
@@ -200,6 +200,46 @@ write_ubo_ssbo_uniforms(struct v3dv_cmd_buffer *cmd_buffer,
}
}
+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_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_TEXTURE_WIDTH:
+ /* We don't u_minify the values, as we are using the image_view
+ * extents
+ */
+ return image_view->extent.width;
+ case QUNIFORM_TEXTURE_HEIGHT:
+ return image_view->extent.height;
+ case QUNIFORM_TEXTURE_DEPTH:
+ return image_view->extent.depth;
+ case QUNIFORM_TEXTURE_ARRAY_SIZE:
+ return image_view->last_layer - image_view->first_layer + 1;
+ case QUNIFORM_TEXTURE_LEVELS:
+ return image_view->max_level - image_view->base_level + 1;
+ default:
+ unreachable("Bad texture size field");
+ }
+}
+
struct v3dv_cl_reloc
v3dv_write_uniforms(struct v3dv_cmd_buffer *cmd_buffer,
struct v3dv_pipeline_stage *p_stage)
@@ -269,6 +309,18 @@ v3dv_write_uniforms(struct v3dv_cmd_buffer *cmd_buffer,
write_tmu_p1(cmd_buffer, pipeline, &uniforms, data);
break;
+ case QUNIFORM_TEXTURE_WIDTH:
+ case QUNIFORM_TEXTURE_HEIGHT:
+ case QUNIFORM_TEXTURE_DEPTH:
+ case QUNIFORM_TEXTURE_ARRAY_SIZE:
+ case QUNIFORM_TEXTURE_LEVELS:
+ cl_aligned_u32(&uniforms,
+ get_texture_size(cmd_buffer,
+ pipeline,
+ uinfo->contents[i],
+ data));
+ break;
+
default:
unreachable("unsupported quniform_contents uniform type\n");
}