v3dv: take memory format from appropriate miplevel for image load/store
We were storing the format of the base miplevel in the image view and we were typically using that instead of the taking the format from the appropriate image slice. This was a problem when loading or storing a miplevel other than the base which happened to have a different format. This also removed the tiling field from the image view to avoid repeating the same mistake in the future. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
committed by
Marge Bot
parent
5d1089b88d
commit
6a909387c2
@@ -818,6 +818,7 @@ cmd_buffer_render_pass_emit_load(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
uint32_t buffer)
|
||||
{
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
uint32_t layer_offset = v3dv_layer_offset(image,
|
||||
iview->base_level,
|
||||
iview->first_layer + layer);
|
||||
@@ -828,9 +829,8 @@ cmd_buffer_render_pass_emit_load(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
|
||||
load.input_image_format = iview->format->rt_type;
|
||||
load.r_b_swap = iview->swap_rb;
|
||||
load.memory_format = iview->tiling;
|
||||
load.memory_format = slice->tiling;
|
||||
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
if (slice->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
slice->tiling == VC5_TILING_UIF_XOR) {
|
||||
load.height_in_ub_or_stride =
|
||||
@@ -932,6 +932,7 @@ cmd_buffer_render_pass_emit_store(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
const struct v3dv_image_view *iview =
|
||||
cmd_buffer->state.framebuffer->attachments[attachment_idx];
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
uint32_t layer_offset = v3dv_layer_offset(image,
|
||||
iview->base_level,
|
||||
iview->first_layer + layer);
|
||||
@@ -943,9 +944,8 @@ cmd_buffer_render_pass_emit_store(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
|
||||
store.output_image_format = iview->format->rt_type;
|
||||
store.r_b_swap = iview->swap_rb;
|
||||
store.memory_format = iview->tiling;
|
||||
store.memory_format = slice->tiling;
|
||||
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
if (slice->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
slice->tiling == VC5_TILING_UIF_XOR) {
|
||||
store.height_in_ub_or_stride =
|
||||
@@ -1289,16 +1289,15 @@ cmd_buffer_emit_render_pass_rcl(struct v3dv_cmd_buffer *cmd_buffer)
|
||||
struct v3dv_image_view *iview =
|
||||
state->framebuffer->attachments[attachment_idx];
|
||||
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
|
||||
const uint32_t *clear_color =
|
||||
&state->attachments[attachment_idx].clear_value.color[0];
|
||||
|
||||
uint32_t clear_pad = 0;
|
||||
if (iview->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
iview->tiling == VC5_TILING_UIF_XOR) {
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice =
|
||||
&image->slices[iview->base_level];
|
||||
|
||||
if (slice->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
slice->tiling == VC5_TILING_UIF_XOR) {
|
||||
int uif_block_height = v3d_utile_height(image->cpp) * 2;
|
||||
|
||||
uint32_t implicit_padded_height =
|
||||
|
||||
@@ -444,8 +444,6 @@ v3dv_CreateImageView(VkDevice _device,
|
||||
iview->offset =
|
||||
v3dv_layer_offset(image, iview->base_level, iview->first_layer);
|
||||
|
||||
iview->tiling = image->slices[0].tiling;
|
||||
|
||||
iview->vk_format = pCreateInfo->format;
|
||||
iview->format = v3dv_get_format(pCreateInfo->format);
|
||||
assert(iview->format && iview->format->supported);
|
||||
|
||||
@@ -53,6 +53,7 @@ emit_tlb_clear_store(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
const struct v3dv_image_view *iview =
|
||||
cmd_buffer->state.framebuffer->attachments[attachment_idx];
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
uint32_t layer_offset = v3dv_layer_offset(image,
|
||||
iview->base_level,
|
||||
iview->first_layer + layer);
|
||||
@@ -64,9 +65,8 @@ emit_tlb_clear_store(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
|
||||
store.output_image_format = iview->format->rt_type;
|
||||
store.r_b_swap = iview->swap_rb;
|
||||
store.memory_format = iview->tiling;
|
||||
store.memory_format = slice->tiling;
|
||||
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
if (slice->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
slice->tiling == VC5_TILING_UIF_XOR) {
|
||||
store.height_in_ub_or_stride =
|
||||
@@ -295,13 +295,12 @@ emit_tlb_clear_rcl(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
clear_color);
|
||||
|
||||
struct v3dv_image_view *iview = framebuffer->attachments[attachment_idx];
|
||||
uint32_t clear_pad = 0;
|
||||
if (iview->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
iview->tiling == VC5_TILING_UIF_XOR) {
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice =
|
||||
&image->slices[iview->base_level];
|
||||
const struct v3dv_image *image = iview->image;
|
||||
const struct v3d_resource_slice *slice = &image->slices[iview->base_level];
|
||||
|
||||
uint32_t clear_pad = 0;
|
||||
if (slice->tiling == VC5_TILING_UIF_NO_XOR ||
|
||||
slice->tiling == VC5_TILING_UIF_XOR) {
|
||||
int uif_block_height = v3d_utile_height(image->cpp) * 2;
|
||||
|
||||
uint32_t implicit_padded_height =
|
||||
|
||||
@@ -333,7 +333,6 @@ struct v3dv_image_view {
|
||||
VkFormat vk_format;
|
||||
const struct v3dv_format *format;
|
||||
bool swap_rb;
|
||||
enum v3d_tiling_mode tiling;
|
||||
uint32_t internal_bpp;
|
||||
uint32_t internal_type;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user