diff options
Diffstat (limited to 'src/broadcom/vulkan/v3dvx_device.c')
-rw-r--r-- | src/broadcom/vulkan/v3dvx_device.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/broadcom/vulkan/v3dvx_device.c b/src/broadcom/vulkan/v3dvx_device.c index 3cd4870a597..c1518f53c35 100644 --- a/src/broadcom/vulkan/v3dvx_device.c +++ b/src/broadcom/vulkan/v3dvx_device.c @@ -26,6 +26,8 @@ #include "broadcom/common/v3d_macros.h" #include "broadcom/cle/v3dx_pack.h" #include "broadcom/compiler/v3d_compiler.h" +#include "vk_format_info.h" +#include "util/u_pack_color.h" static const enum V3DX(Wrap_Mode) vk_to_v3d_wrap_mode[] = { [VK_SAMPLER_ADDRESS_MODE_REPEAT] = V3D_WRAP_MODE_REPEAT, @@ -180,3 +182,56 @@ v3dX(framebuffer_compute_internal_bpp_msaa)( return; } + +uint32_t +v3dX(zs_buffer_from_aspect_bits)(VkImageAspectFlags aspects) +{ + const VkImageAspectFlags zs_aspects = + VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + const VkImageAspectFlags filtered_aspects = aspects & zs_aspects; + + if (filtered_aspects == zs_aspects) + return ZSTENCIL; + else if (filtered_aspects == VK_IMAGE_ASPECT_DEPTH_BIT) + return Z; + else if (filtered_aspects == VK_IMAGE_ASPECT_STENCIL_BIT) + return STENCIL; + else + return NONE; +} + +void +v3dX(get_hw_clear_color)(const VkClearColorValue *color, + uint32_t internal_type, + uint32_t internal_size, + uint32_t *hw_color) +{ + union util_color uc; + switch (internal_type) { + case V3D_INTERNAL_TYPE_8: + util_pack_color(color->float32, PIPE_FORMAT_R8G8B8A8_UNORM, &uc); + memcpy(hw_color, uc.ui, internal_size); + break; + case V3D_INTERNAL_TYPE_8I: + case V3D_INTERNAL_TYPE_8UI: + hw_color[0] = ((color->uint32[0] & 0xff) | + (color->uint32[1] & 0xff) << 8 | + (color->uint32[2] & 0xff) << 16 | + (color->uint32[3] & 0xff) << 24); + break; + case V3D_INTERNAL_TYPE_16F: + util_pack_color(color->float32, PIPE_FORMAT_R16G16B16A16_FLOAT, &uc); + memcpy(hw_color, uc.ui, internal_size); + break; + case V3D_INTERNAL_TYPE_16I: + case V3D_INTERNAL_TYPE_16UI: + hw_color[0] = ((color->uint32[0] & 0xffff) | color->uint32[1] << 16); + hw_color[1] = ((color->uint32[2] & 0xffff) | color->uint32[3] << 16); + break; + case V3D_INTERNAL_TYPE_32F: + case V3D_INTERNAL_TYPE_32I: + case V3D_INTERNAL_TYPE_32UI: + memcpy(hw_color, color->uint32, internal_size); + break; + } +} |