diff --git a/.pick_status.json b/.pick_status.json index a39e02866a7..3e17047cf76 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1966,7 +1966,7 @@ "description": "lavapipe: Use common Vulkan format helpers", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "b38879f8c5f57b7f1802e433e33181bdf5e72aef" }, diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index c1e6e396bfc..0412f86ae49 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -632,7 +632,7 @@ static void handle_graphics_pipeline(struct lvp_cmd_buffer_entry *cmd, unsigned location = vi->pVertexAttributeDescriptions[i].location; state->ve[location].src_offset = vi->pVertexAttributeDescriptions[i].offset; state->ve[location].vertex_buffer_index = vi->pVertexAttributeDescriptions[i].binding; - state->ve[location].src_format = vk_format_to_pipe(vi->pVertexAttributeDescriptions[i].format); + state->ve[location].src_format = lvp_vk_format_to_pipe_format(vi->pVertexAttributeDescriptions[i].format); switch (vi->pVertexBindingDescriptions[vi->pVertexAttributeDescriptions[i].binding].inputRate) { case VK_VERTEX_INPUT_RATE_VERTEX: @@ -853,11 +853,11 @@ static void fill_sampler_view_stage(struct rendering_state *state, enum pipe_format pformat; if (iv->subresourceRange.aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT) - pformat = vk_format_to_pipe(iv->format); + pformat = lvp_vk_format_to_pipe_format(iv->format); else if (iv->subresourceRange.aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT) - pformat = util_format_stencil_only(vk_format_to_pipe(iv->format)); + pformat = util_format_stencil_only(lvp_vk_format_to_pipe_format(iv->format)); else - pformat = vk_format_to_pipe(iv->format); + pformat = lvp_vk_format_to_pipe_format(iv->format); u_sampler_view_default_template(&templ, iv->image->bo, pformat); @@ -955,11 +955,11 @@ static void fill_image_view_stage(struct rendering_state *state, idx += dyn_info->stage[stage].image_count; state->iv[p_stage][idx].resource = iv->image->bo; if (iv->subresourceRange.aspectMask == VK_IMAGE_ASPECT_DEPTH_BIT) - state->iv[p_stage][idx].format = vk_format_to_pipe(iv->format); + state->iv[p_stage][idx].format = lvp_vk_format_to_pipe_format(iv->format); else if (iv->subresourceRange.aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT) - state->iv[p_stage][idx].format = util_format_stencil_only(vk_format_to_pipe(iv->format)); + state->iv[p_stage][idx].format = util_format_stencil_only(lvp_vk_format_to_pipe_format(iv->format)); else - state->iv[p_stage][idx].format = vk_format_to_pipe(iv->format); + state->iv[p_stage][idx].format = lvp_vk_format_to_pipe_format(iv->format); if (iv->view_type == VK_IMAGE_VIEW_TYPE_3D) { state->iv[p_stage][idx].u.tex.first_layer = 0; @@ -1212,7 +1212,7 @@ static struct pipe_surface *create_img_surface(struct rendering_state *state, int base_layer, int layer_count) { return create_img_surface_bo(state, &imgv->subresourceRange, imgv->image->bo, - vk_format_to_pipe(format), width, height, base_layer, layer_count, 0); + lvp_vk_format_to_pipe_format(format), width, height, base_layer, layer_count, 0); } static void add_img_view_surface(struct rendering_state *state, diff --git a/src/gallium/frontends/lavapipe/lvp_formats.c b/src/gallium/frontends/lavapipe/lvp_formats.c index 30a38c20f3e..84fc34fb06a 100644 --- a/src/gallium/frontends/lavapipe/lvp_formats.c +++ b/src/gallium/frontends/lavapipe/lvp_formats.c @@ -26,138 +26,6 @@ #include "util/u_math.h" #include "vk_util.h" -#define COMMON_NAME(x) [VK_FORMAT_##x] = PIPE_FORMAT_##x - -#define FLOAT_NAME(x) [VK_FORMAT_##x##_SFLOAT] = PIPE_FORMAT_##x##_FLOAT - -static enum pipe_format format_to_vk_table[VK_FORMAT_ASTC_12x12_SRGB_BLOCK + 1] = { - - COMMON_NAME(R8_UNORM), - COMMON_NAME(R8G8_UNORM), - COMMON_NAME(R8G8B8_UNORM), - COMMON_NAME(R8G8B8A8_UNORM), - - COMMON_NAME(R8_SNORM), - COMMON_NAME(R8G8_SNORM), - COMMON_NAME(R8G8B8_SNORM), - COMMON_NAME(R8G8B8A8_SNORM), - - // COMMON_NAME(R8_SRGB), - COMMON_NAME(R8G8B8_SRGB), - COMMON_NAME(R8G8B8A8_SRGB), - - COMMON_NAME(B8G8R8A8_UNORM), - COMMON_NAME(R8G8B8A8_SRGB), - COMMON_NAME(B8G8R8A8_SRGB), - - COMMON_NAME(R8_UINT), - COMMON_NAME(R8G8_UINT), - COMMON_NAME(R8G8B8_UINT), - COMMON_NAME(R8G8B8A8_UINT), - - COMMON_NAME(R16_UINT), - COMMON_NAME(R16G16_UINT), - COMMON_NAME(R16G16B16_UINT), - COMMON_NAME(R16G16B16A16_UINT), - - COMMON_NAME(R32_UINT), - COMMON_NAME(R32G32_UINT), - COMMON_NAME(R32G32B32_UINT), - COMMON_NAME(R32G32B32A32_UINT), - - COMMON_NAME(R8_SINT), - COMMON_NAME(R8G8_SINT), - COMMON_NAME(R8G8B8_SINT), - COMMON_NAME(R8G8B8A8_SINT), - - COMMON_NAME(R16_SINT), - COMMON_NAME(R16G16_SINT), - COMMON_NAME(R16G16B16_SINT), - COMMON_NAME(R16G16B16A16_SINT), - - COMMON_NAME(R32_SINT), - COMMON_NAME(R32G32_SINT), - COMMON_NAME(R32G32B32_SINT), - COMMON_NAME(R32G32B32A32_SINT), - - COMMON_NAME(R16_UNORM), - COMMON_NAME(R16G16_UNORM), - COMMON_NAME(R16G16B16A16_UNORM), - - COMMON_NAME(R16_SNORM), - COMMON_NAME(R16G16_SNORM), - COMMON_NAME(R16G16B16A16_SNORM), - FLOAT_NAME(R16), - FLOAT_NAME(R16G16), - FLOAT_NAME(R16G16B16), - FLOAT_NAME(R16G16B16A16), - - FLOAT_NAME(R32), - FLOAT_NAME(R32G32), - FLOAT_NAME(R32G32B32), - FLOAT_NAME(R32G32B32A32), - - COMMON_NAME(S8_UINT), - [VK_FORMAT_UNDEFINED] = PIPE_FORMAT_NONE, - [VK_FORMAT_R5G6B5_UNORM_PACK16] = PIPE_FORMAT_B5G6R5_UNORM, - [VK_FORMAT_A1R5G5B5_UNORM_PACK16] = PIPE_FORMAT_B5G5R5A1_UNORM, - [VK_FORMAT_B4G4R4A4_UNORM_PACK16] = PIPE_FORMAT_A4R4G4B4_UNORM, - [VK_FORMAT_D16_UNORM] = PIPE_FORMAT_Z16_UNORM, - - [VK_FORMAT_A8B8G8R8_UNORM_PACK32] = PIPE_FORMAT_R8G8B8A8_UNORM, - [VK_FORMAT_A8B8G8R8_SNORM_PACK32] = PIPE_FORMAT_R8G8B8A8_SNORM, - [VK_FORMAT_A8B8G8R8_UINT_PACK32] = PIPE_FORMAT_R8G8B8A8_UINT, - [VK_FORMAT_A8B8G8R8_SINT_PACK32] = PIPE_FORMAT_R8G8B8A8_SINT, - [VK_FORMAT_A8B8G8R8_SRGB_PACK32] = PIPE_FORMAT_R8G8B8A8_SRGB, - - [VK_FORMAT_A2B10G10R10_UNORM_PACK32] = PIPE_FORMAT_R10G10B10A2_UNORM, - [VK_FORMAT_A2B10G10R10_SNORM_PACK32] = PIPE_FORMAT_R10G10B10A2_SNORM, - [VK_FORMAT_A2R10G10B10_UNORM_PACK32] = PIPE_FORMAT_B10G10R10A2_UNORM, - [VK_FORMAT_A2R10G10B10_SNORM_PACK32] = PIPE_FORMAT_B10G10R10A2_SNORM, - - [VK_FORMAT_A2B10G10R10_UINT_PACK32] = PIPE_FORMAT_R10G10B10A2_UINT, - [VK_FORMAT_A2R10G10B10_UINT_PACK32] = PIPE_FORMAT_B10G10R10A2_UINT, - [VK_FORMAT_A2B10G10R10_USCALED_PACK32] = PIPE_FORMAT_R10G10B10A2_USCALED, - [VK_FORMAT_A2B10G10R10_SSCALED_PACK32] = PIPE_FORMAT_R10G10B10A2_SSCALED, - [VK_FORMAT_A2R10G10B10_USCALED_PACK32] = PIPE_FORMAT_B10G10R10A2_USCALED, - [VK_FORMAT_A2R10G10B10_SSCALED_PACK32] = PIPE_FORMAT_B10G10R10A2_SSCALED, - - [VK_FORMAT_B10G11R11_UFLOAT_PACK32] = PIPE_FORMAT_R11G11B10_FLOAT, - [VK_FORMAT_E5B9G9R9_UFLOAT_PACK32] = PIPE_FORMAT_R9G9B9E5_FLOAT, - - [VK_FORMAT_X8_D24_UNORM_PACK32] = PIPE_FORMAT_Z24X8_UNORM, - [VK_FORMAT_D32_SFLOAT] = PIPE_FORMAT_Z32_FLOAT, - [VK_FORMAT_D24_UNORM_S8_UINT] = PIPE_FORMAT_Z24_UNORM_S8_UINT, - [VK_FORMAT_D32_SFLOAT_S8_UINT] = PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, - - [VK_FORMAT_BC1_RGB_UNORM_BLOCK] = PIPE_FORMAT_DXT1_RGB, - [VK_FORMAT_BC1_RGBA_UNORM_BLOCK] = PIPE_FORMAT_DXT1_RGBA, - [VK_FORMAT_BC2_UNORM_BLOCK] = PIPE_FORMAT_DXT3_RGBA, - [VK_FORMAT_BC3_UNORM_BLOCK] = PIPE_FORMAT_DXT5_RGBA, - [VK_FORMAT_BC4_UNORM_BLOCK] = PIPE_FORMAT_RGTC1_UNORM, - [VK_FORMAT_BC5_UNORM_BLOCK] = PIPE_FORMAT_RGTC2_UNORM, - - [VK_FORMAT_BC1_RGB_SRGB_BLOCK] = PIPE_FORMAT_DXT1_SRGB, - [VK_FORMAT_BC1_RGBA_SRGB_BLOCK] = PIPE_FORMAT_DXT1_SRGBA, - [VK_FORMAT_BC2_SRGB_BLOCK] = PIPE_FORMAT_DXT3_SRGBA, - [VK_FORMAT_BC3_SRGB_BLOCK] = PIPE_FORMAT_DXT5_SRGBA, - - [VK_FORMAT_BC4_SNORM_BLOCK] = PIPE_FORMAT_RGTC1_SNORM, - [VK_FORMAT_BC5_SNORM_BLOCK] = PIPE_FORMAT_RGTC2_SNORM, - - [VK_FORMAT_BC6H_UFLOAT_BLOCK] = PIPE_FORMAT_BPTC_RGB_UFLOAT, - [VK_FORMAT_BC6H_SFLOAT_BLOCK] = PIPE_FORMAT_BPTC_RGB_FLOAT, - [VK_FORMAT_BC7_UNORM_BLOCK] = PIPE_FORMAT_BPTC_RGBA_UNORM, - [VK_FORMAT_BC7_SRGB_BLOCK] = PIPE_FORMAT_BPTC_SRGBA, -}; - -enum pipe_format vk_format_to_pipe(VkFormat format) -{ - if (format > VK_FORMAT_ASTC_12x12_SRGB_BLOCK) - return PIPE_FORMAT_NONE; - return format_to_vk_table[format]; -} - static bool lvp_is_filter_minmax_format_supported(VkFormat format) { /* From the Vulkan spec 1.1.71: @@ -192,7 +60,7 @@ lvp_physical_device_get_format_properties(struct lvp_physical_device *physical_d VkFormat format, VkFormatProperties *out_properties) { - enum pipe_format pformat = vk_format_to_pipe(format); + enum pipe_format pformat = lvp_vk_format_to_pipe_format(format); unsigned features = 0, buffer_features = 0; if (pformat == PIPE_FORMAT_NONE) { out_properties->linearTilingFeatures = 0; @@ -302,7 +170,7 @@ static VkResult lvp_get_image_format_properties(struct lvp_physical_device *phys uint32_t maxMipLevels; uint32_t maxArraySize; VkSampleCountFlags sampleCounts = VK_SAMPLE_COUNT_1_BIT; - enum pipe_format pformat = vk_format_to_pipe(info->format); + enum pipe_format pformat = lvp_vk_format_to_pipe_format(info->format); lvp_physical_device_get_format_properties(physical_device, info->format, &format_props); if (info->tiling == VK_IMAGE_TILING_LINEAR) { diff --git a/src/gallium/frontends/lavapipe/lvp_image.c b/src/gallium/frontends/lavapipe/lvp_image.c index 6ea29c950fa..68facac8a3d 100644 --- a/src/gallium/frontends/lavapipe/lvp_image.c +++ b/src/gallium/frontends/lavapipe/lvp_image.c @@ -79,7 +79,7 @@ lvp_image_create(VkDevice _device, if (pCreateInfo->usage & VK_IMAGE_USAGE_STORAGE_BIT) template.bind |= PIPE_BIND_SHADER_IMAGE; - template.format = vk_format_to_pipe(pCreateInfo->format); + template.format = lvp_vk_format_to_pipe_format(pCreateInfo->format); template.width0 = pCreateInfo->extent.width; template.height0 = pCreateInfo->extent.height; template.depth0 = pCreateInfo->extent.depth; @@ -199,7 +199,7 @@ lvp_CreateImageView(VkDevice _device, VK_OBJECT_TYPE_IMAGE_VIEW); view->view_type = pCreateInfo->viewType; view->format = pCreateInfo->format; - view->pformat = vk_format_to_pipe(pCreateInfo->format); + view->pformat = lvp_vk_format_to_pipe_format(pCreateInfo->format); view->components = pCreateInfo->components; view->subresourceRange = pCreateInfo->subresourceRange; view->image = image; @@ -402,7 +402,7 @@ lvp_CreateBufferView(VkDevice _device, VK_OBJECT_TYPE_BUFFER_VIEW); view->buffer = buffer; view->format = pCreateInfo->format; - view->pformat = vk_format_to_pipe(pCreateInfo->format); + view->pformat = lvp_vk_format_to_pipe_format(pCreateInfo->format); view->offset = pCreateInfo->offset; view->range = pCreateInfo->range; *pView = lvp_buffer_view_to_handle(view); diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index 4567b09db30..8a57be932e2 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -54,6 +54,7 @@ typedef uint32_t xcb_window_t; #include "vk_physical_device.h" #include "vk_shader_module.h" #include "vk_util.h" +#include "vk_format.h" #include "wsi_common.h" @@ -1107,31 +1108,39 @@ VkResult lvp_execute_cmds(struct lvp_device *device, struct lvp_image *lvp_swapchain_get_image(VkSwapchainKHR swapchain, uint32_t index); -enum pipe_format vk_format_to_pipe(VkFormat format); -static inline VkImageAspectFlags -vk_format_aspects(VkFormat format) +static inline enum pipe_format +lvp_vk_format_to_pipe_format(VkFormat format) { - switch (format) { - case VK_FORMAT_UNDEFINED: - return 0; + /* Some formats cause problems with CTS right now.*/ + if (format == VK_FORMAT_R4G4B4A4_UNORM_PACK16 || + format == VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT || /* VK_EXT_4444_formats */ + format == VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT || /* VK_EXT_4444_formats */ + format == VK_FORMAT_R5G5B5A1_UNORM_PACK16 || + format == VK_FORMAT_R8_SRGB || + format == VK_FORMAT_R8G8_SRGB || + format == VK_FORMAT_R64G64B64A64_SFLOAT || + format == VK_FORMAT_R64_SFLOAT || + format == VK_FORMAT_R64G64_SFLOAT || + format == VK_FORMAT_R64G64B64_SFLOAT || + format == VK_FORMAT_A2R10G10B10_SINT_PACK32 || + format == VK_FORMAT_A2B10G10R10_SINT_PACK32 || + format == VK_FORMAT_G8B8G8R8_422_UNORM || + format == VK_FORMAT_B8G8R8G8_422_UNORM || + format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM || + format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM || + format == VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM || + format == VK_FORMAT_G8_B8R8_2PLANE_422_UNORM || + format == VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM || + format == VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM || + format == VK_FORMAT_G16_B16R16_2PLANE_420_UNORM || + format == VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM || + format == VK_FORMAT_G16_B16R16_2PLANE_422_UNORM || + format == VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM || + format == VK_FORMAT_D16_UNORM_S8_UINT) + return PIPE_FORMAT_NONE; - case VK_FORMAT_S8_UINT: - return VK_IMAGE_ASPECT_STENCIL_BIT; - - case VK_FORMAT_D16_UNORM_S8_UINT: - case VK_FORMAT_D24_UNORM_S8_UINT: - case VK_FORMAT_D32_SFLOAT_S8_UINT: - return VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_X8_D24_UNORM_PACK32: - case VK_FORMAT_D32_SFLOAT: - return VK_IMAGE_ASPECT_DEPTH_BIT; - - default: - return VK_IMAGE_ASPECT_COLOR_BIT; - } + return vk_format_to_pipe_format(format); } #ifdef __cplusplus