mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader: Use 64 bit swizzles for 64 bit data types in VSIR.
The handling of write masks and swizzles for 64 bit data types is currently irregular: write masks are always 64 bit, while swizzles are usually 32 bit, except for SSA registers with are 64 bit. With this change we always use 64 bit swizzles, in order to make the situation less surprising and make it easier to convert registers between SSA and TEMP. 64 bit swizzles are always required to have X in their last two components.
This commit is contained in:
committed by
Alexandre Julliard
parent
5ec1825eb3
commit
1f536238a8
Notes:
Alexandre Julliard
2024-01-29 22:52:55 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Conor McCarthy (@cmccarthy) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/603
@@ -1641,16 +1641,55 @@ static inline uint32_t vsir_write_mask_32_from_64(uint32_t write_mask64)
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint32_t vsir_swizzle_64_from_32(uint32_t swizzle32)
|
||||
{
|
||||
switch (swizzle32)
|
||||
{
|
||||
case VKD3D_SHADER_SWIZZLE(X, Y, X, Y):
|
||||
return VKD3D_SHADER_SWIZZLE(X, X, X, X);
|
||||
|
||||
case VKD3D_SHADER_SWIZZLE(X, Y, Z, W):
|
||||
return VKD3D_SHADER_SWIZZLE(X, Y, X, X);
|
||||
|
||||
case VKD3D_SHADER_SWIZZLE(Z, W, X, Y):
|
||||
return VKD3D_SHADER_SWIZZLE(Y, X, X, X);
|
||||
|
||||
case VKD3D_SHADER_SWIZZLE(Z, W, Z, W):
|
||||
return VKD3D_SHADER_SWIZZLE(Y, Y, X, X);
|
||||
|
||||
default:
|
||||
ERR("Invalid 32 bit swizzle when converting to 64 bit: %#x.\n", swizzle32);
|
||||
return VKD3D_SHADER_SWIZZLE(X, X, X, X);
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint32_t vsir_swizzle_32_from_64(uint32_t swizzle64)
|
||||
{
|
||||
switch (swizzle64)
|
||||
{
|
||||
case VKD3D_SHADER_SWIZZLE(X, X, X, X):
|
||||
return VKD3D_SHADER_SWIZZLE(X, Y, X, Y);
|
||||
|
||||
case VKD3D_SHADER_SWIZZLE(X, Y, X, X):
|
||||
return VKD3D_SHADER_SWIZZLE(X, Y, Z, W);
|
||||
|
||||
case VKD3D_SHADER_SWIZZLE(Y, X, X, X):
|
||||
return VKD3D_SHADER_SWIZZLE(Z, W, X, Y);
|
||||
|
||||
case VKD3D_SHADER_SWIZZLE(Y, Y, X, X):
|
||||
return VKD3D_SHADER_SWIZZLE(Z, W, Z, W);
|
||||
|
||||
default:
|
||||
ERR("Invalid 64 bit swizzle: %#x.\n", swizzle64);
|
||||
return VKD3D_SHADER_SWIZZLE(X, Y, X, Y);
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned int vsir_swizzle_get_component(uint32_t swizzle, unsigned int idx)
|
||||
{
|
||||
return (swizzle >> VKD3D_SHADER_SWIZZLE_SHIFT(idx)) & VKD3D_SHADER_SWIZZLE_MASK;
|
||||
}
|
||||
|
||||
static inline unsigned int vsir_swizzle_get_component64(uint32_t swizzle, unsigned int idx)
|
||||
{
|
||||
return ((swizzle >> VKD3D_SHADER_SWIZZLE_SHIFT(idx * 2)) & VKD3D_SHADER_SWIZZLE_MASK) / 2u;
|
||||
}
|
||||
|
||||
static inline unsigned int vkd3d_compact_swizzle(uint32_t swizzle, uint32_t write_mask)
|
||||
{
|
||||
unsigned int i, compacted_swizzle = 0;
|
||||
|
||||
Reference in New Issue
Block a user