mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-20 08:00:28 +01:00
pvr: PBE fix mesa pipe swizzle conversion
The swizzle of pipe formats is described in
"struct util_format_description". The struct has array
"unsigned char swizzle[4];". The index of the array is the colour
channel (in the order R, G, B and A). The value is what position
the colour channel is sourced from.
In PBE register settings (REG_SWIZ_CHAN[0-3]) the register index is
output channel position (and not colour). The colours are in the PBE
source channels - SWIZ_SOURCE_CHAN0 typically red.
The function pvr_get_pbe_hw_swizzle doesn't translate the swizzle
correctly. Remove function and replace with switch for each colour.
This could be done in a for loop, but there is just as much code
in the loop, it involves pointers and it's less readable for humans.
That's why I opted for this implementation.
Fixed test:
dEQP-VK.api.copy_and_blit.core.image_to_image
.all_formats.color.2d.r4g4b4a4_unorm_pack16.b4g4r4a4_unorm_pack16
and other with this pixel format.
Signed-off-by: Oskar Rundgren <oskar.rundgren@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22958>
This commit is contained in:
parent
f1e339dfd6
commit
0e3c828fc4
1 changed files with 100 additions and 36 deletions
|
|
@ -36,34 +36,6 @@
|
|||
#include "vk_format.h"
|
||||
#include "vk_object.h"
|
||||
|
||||
/* clang-format off */
|
||||
static enum PVRX(PBESTATE_SWIZ)
|
||||
pvr_get_pbe_hw_swizzle(VkComponentSwizzle comp, enum pipe_swizzle swz)
|
||||
/* clang-format on */
|
||||
{
|
||||
switch (swz) {
|
||||
case PIPE_SWIZZLE_0:
|
||||
return ROGUE_PBESTATE_SWIZ_ZERO;
|
||||
case PIPE_SWIZZLE_1:
|
||||
return ROGUE_PBESTATE_SWIZ_ONE;
|
||||
case PIPE_SWIZZLE_X:
|
||||
return ROGUE_PBESTATE_SWIZ_SOURCE_CHAN0;
|
||||
case PIPE_SWIZZLE_Y:
|
||||
return ROGUE_PBESTATE_SWIZ_SOURCE_CHAN1;
|
||||
case PIPE_SWIZZLE_Z:
|
||||
return ROGUE_PBESTATE_SWIZ_SOURCE_CHAN2;
|
||||
case PIPE_SWIZZLE_W:
|
||||
return ROGUE_PBESTATE_SWIZ_SOURCE_CHAN3;
|
||||
case PIPE_SWIZZLE_NONE:
|
||||
if (comp == VK_COMPONENT_SWIZZLE_A)
|
||||
return ROGUE_PBESTATE_SWIZ_ONE;
|
||||
else
|
||||
return ROGUE_PBESTATE_SWIZ_ZERO;
|
||||
default:
|
||||
unreachable("Unknown enum pipe_swizzle");
|
||||
};
|
||||
}
|
||||
|
||||
void pvr_pbe_get_src_format_and_gamma(VkFormat vk_format,
|
||||
enum pvr_pbe_gamma default_gamma,
|
||||
bool with_packed_usc_channel,
|
||||
|
|
@ -256,14 +228,106 @@ void pvr_pbe_pack_state(
|
|||
PVRX(PBESTATE_REG_WORD0_LINESTRIDE_UNIT_SIZE);
|
||||
reg.minclip_x = render_params->min_x_clip;
|
||||
|
||||
reg.swiz_chan0 = pvr_get_pbe_hw_swizzle(VK_COMPONENT_SWIZZLE_R,
|
||||
surface_params->swizzle[0]);
|
||||
reg.swiz_chan1 = pvr_get_pbe_hw_swizzle(VK_COMPONENT_SWIZZLE_G,
|
||||
surface_params->swizzle[1]);
|
||||
reg.swiz_chan2 = pvr_get_pbe_hw_swizzle(VK_COMPONENT_SWIZZLE_B,
|
||||
surface_params->swizzle[2]);
|
||||
reg.swiz_chan3 = pvr_get_pbe_hw_swizzle(VK_COMPONENT_SWIZZLE_A,
|
||||
surface_params->swizzle[3]);
|
||||
/* r, y or depth*/
|
||||
switch (surface_params->swizzle[0]) {
|
||||
case PIPE_SWIZZLE_X:
|
||||
reg.swiz_chan0 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN0;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Y:
|
||||
reg.swiz_chan1 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN0;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Z:
|
||||
reg.swiz_chan2 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN0;
|
||||
break;
|
||||
case PIPE_SWIZZLE_W:
|
||||
reg.swiz_chan3 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN0;
|
||||
break;
|
||||
case PIPE_SWIZZLE_0:
|
||||
case PIPE_SWIZZLE_NONE:
|
||||
reg.swiz_chan0 = ROGUE_PBESTATE_SWIZ_ZERO;
|
||||
break;
|
||||
case PIPE_SWIZZLE_1:
|
||||
reg.swiz_chan0 = ROGUE_PBESTATE_SWIZ_ONE;
|
||||
break;
|
||||
default:
|
||||
unreachable("Unknown enum pipe_swizzle");
|
||||
break;
|
||||
}
|
||||
/* g, u or stencil*/
|
||||
switch (surface_params->swizzle[1]) {
|
||||
case PIPE_SWIZZLE_X:
|
||||
reg.swiz_chan0 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN1;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Y:
|
||||
reg.swiz_chan1 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN1;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Z:
|
||||
reg.swiz_chan2 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN1;
|
||||
break;
|
||||
case PIPE_SWIZZLE_W:
|
||||
reg.swiz_chan3 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN1;
|
||||
break;
|
||||
case PIPE_SWIZZLE_0:
|
||||
case PIPE_SWIZZLE_NONE:
|
||||
reg.swiz_chan1 = ROGUE_PBESTATE_SWIZ_ZERO;
|
||||
break;
|
||||
case PIPE_SWIZZLE_1:
|
||||
reg.swiz_chan1 = ROGUE_PBESTATE_SWIZ_ONE;
|
||||
break;
|
||||
default:
|
||||
unreachable("Unknown enum pipe_swizzle");
|
||||
break;
|
||||
}
|
||||
/* b or v*/
|
||||
switch (surface_params->swizzle[2]) {
|
||||
case PIPE_SWIZZLE_X:
|
||||
reg.swiz_chan0 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN2;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Y:
|
||||
reg.swiz_chan1 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN2;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Z:
|
||||
reg.swiz_chan2 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN2;
|
||||
break;
|
||||
case PIPE_SWIZZLE_W:
|
||||
reg.swiz_chan3 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN2;
|
||||
break;
|
||||
case PIPE_SWIZZLE_0:
|
||||
case PIPE_SWIZZLE_NONE:
|
||||
reg.swiz_chan2 = ROGUE_PBESTATE_SWIZ_ZERO;
|
||||
break;
|
||||
case PIPE_SWIZZLE_1:
|
||||
reg.swiz_chan2 = ROGUE_PBESTATE_SWIZ_ONE;
|
||||
break;
|
||||
default:
|
||||
unreachable("Unknown enum pipe_swizzle");
|
||||
break;
|
||||
}
|
||||
/* a */
|
||||
switch (surface_params->swizzle[3]) {
|
||||
case PIPE_SWIZZLE_X:
|
||||
reg.swiz_chan0 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN3;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Y:
|
||||
reg.swiz_chan1 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN3;
|
||||
break;
|
||||
case PIPE_SWIZZLE_Z:
|
||||
reg.swiz_chan2 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN3;
|
||||
break;
|
||||
case PIPE_SWIZZLE_W:
|
||||
reg.swiz_chan3 = ROGUE_PBESTATE_SWIZ_SOURCE_CHAN3;
|
||||
break;
|
||||
case PIPE_SWIZZLE_0:
|
||||
case PIPE_SWIZZLE_NONE:
|
||||
reg.swiz_chan3 = ROGUE_PBESTATE_SWIZ_ZERO;
|
||||
break;
|
||||
case PIPE_SWIZZLE_1:
|
||||
reg.swiz_chan3 = ROGUE_PBESTATE_SWIZ_ONE;
|
||||
break;
|
||||
default:
|
||||
unreachable("Unknown enum pipe_swizzle");
|
||||
break;
|
||||
}
|
||||
|
||||
if (surface_params->mem_layout == PVR_MEMLAYOUT_3DTWIDDLED)
|
||||
reg.size_z = util_logbase2_ceil(surface_params->depth);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue