mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-21 09:50:36 +02:00
pvr: improve buffer copy format selection
Take the source and destination address alignment into account when selecting the pixel format / texel width. This avoids the transfer job code having to handle an unaligned copy and, as a result, trying to encode a value that is too large for the maxclip_x field in PBESTATE_REG_WORD1. Fixes the following test cases: dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_32_fixed2_vec2_dynamic_draw_quads_256 dEQP-GLES2.functional.vertex_arrays.single_attribute.offset.buffer_4_8_fixed2_vec2_dynamic_draw_quads_256 Signed-off-by: Oskar Rundgren <oskar.rundgren@imgtec.com> Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31679>
This commit is contained in:
parent
1d0f23752c
commit
703f3e902c
1 changed files with 5 additions and 1 deletions
|
|
@ -1246,6 +1246,8 @@ static VkResult pvr_cmd_copy_buffer_region(struct pvr_cmd_buffer *cmd_buffer,
|
|||
while (offset < size) {
|
||||
const VkDeviceSize remaining_size = size - offset;
|
||||
struct pvr_transfer_cmd *transfer_cmd;
|
||||
uint32_t src_align = (src_addr.addr + offset + src_offset) & 0xF;
|
||||
uint32_t dst_align = (dst_addr.addr + offset + src_offset) & 0xF;
|
||||
uint32_t texel_width;
|
||||
VkDeviceSize texels;
|
||||
VkFormat vk_format;
|
||||
|
|
@ -1256,7 +1258,9 @@ static VkResult pvr_cmd_copy_buffer_region(struct pvr_cmd_buffer *cmd_buffer,
|
|||
if (is_fill) {
|
||||
vk_format = VK_FORMAT_R32_UINT;
|
||||
texel_width = 4U;
|
||||
} else if (remaining_size >= 16U) {
|
||||
} else if (remaining_size >= 16U && (src_align % 16U) == 0 &&
|
||||
(dst_align % 16U) == 0) {
|
||||
/* Only if address is 128bpp aligned */
|
||||
vk_format = VK_FORMAT_R32G32B32A32_UINT;
|
||||
texel_width = 16U;
|
||||
} else if (remaining_size >= 4U) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue