blob: f8e6269ebec736d9c22f062c8709695aa9cded23 [file]
/*
* Copyright 2023 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef VK_TEXCOMPRESS_ETC2_H
#define VK_TEXCOMPRESS_ETC2_H
#include "util/simple_mtx.h"
#include "vk_device.h"
#include "vk_format.h"
#include "vk_object.h"
#ifdef __cplusplus
extern "C" {
#endif
struct nir_shader_compiler_options;
struct vk_texcompress_etc2_state {
/* these are specified by the driver */
const VkAllocationCallbacks *allocator;
const struct nir_shader_compiler_options *nir_options;
VkPipelineCache pipeline_cache;
/*
* The pipeline is a compute pipeline with
*
* - layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
* - layout(set = 0, binding = 0) uniform utexture2DArray s_tex_2d;
* - layout(set = 0, binding = 0) uniform utexture3D s_tex_3d;
* - layout(set = 0, binding = 1) uniform image2DArray out_img_2d;
* - layout(set = 0, binding = 1) uniform image3D out_img_3d;
* - layout(push_constant) uniform Registers {
* ivec3 offset;
* int vk_format;
* int vk_image_type;
* } registers;
*
* There are other implications, such as
*
* - to make sure vkCmdCopyBufferToImage and vkCmdCopyImage are the only
* means to initialize the image data,
* - the format feature flags should not include flags that allow
* modifying the image data
* - the image tiling should be VK_IMAGE_TILING_OPTIMAL
* - the image usage flags should not include
* VK_IMAGE_USAGE_STORAGE_BIT, which can be made valid via
* VK_IMAGE_CREATE_EXTENDED_USAGE_BIT
* - the image create flags are assumed to include
* VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT and
* VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT
* - the image usage flags are assumed to include
* VK_IMAGE_USAGE_SAMPLED_BIT (for src) or VK_IMAGE_USAGE_STORAGE_BIT
* (for dst)
*/
simple_mtx_t mutex;
VkDescriptorSetLayout ds_layout;
VkPipelineLayout pipeline_layout;
VkPipeline pipeline;
};
void vk_texcompress_etc2_init(struct vk_device *device, struct vk_texcompress_etc2_state *etc2);
VkResult vk_texcompress_etc2_late_init(struct vk_device *device, struct vk_texcompress_etc2_state *etc2);
void vk_texcompress_etc2_finish(struct vk_device *device, struct vk_texcompress_etc2_state *etc2);
static inline VkImageViewType
vk_texcompress_etc2_image_view_type(VkImageType image_type)
{
switch (image_type) {
case VK_IMAGE_TYPE_2D:
return VK_IMAGE_VIEW_TYPE_2D_ARRAY;
case VK_IMAGE_TYPE_3D:
return VK_IMAGE_VIEW_TYPE_3D;
default:
unreachable("bad image type");
}
}
static inline VkFormat
vk_texcompress_etc2_emulation_format(VkFormat etc2_format)
{
switch (etc2_format) {
case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
return VK_FORMAT_R8G8B8A8_UNORM;
case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
return VK_FORMAT_R8G8B8A8_SRGB;
case VK_FORMAT_EAC_R11_UNORM_BLOCK:
return VK_FORMAT_R16_UNORM;
case VK_FORMAT_EAC_R11_SNORM_BLOCK:
return VK_FORMAT_R16_SNORM;
case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
return VK_FORMAT_R16G16_UNORM;
case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
return VK_FORMAT_R16G16_SNORM;
default:
return VK_FORMAT_UNDEFINED;
}
}
static inline VkFormat
vk_texcompress_etc2_load_format(VkFormat etc2_format)
{
return vk_format_get_blocksize(etc2_format) == 16 ? VK_FORMAT_R32G32B32A32_UINT : VK_FORMAT_R32G32_UINT;
}
static inline VkFormat
vk_texcompress_etc2_store_format(VkFormat etc2_format)
{
VkFormat format = vk_texcompress_etc2_emulation_format(etc2_format);
if (format == VK_FORMAT_R8G8B8A8_SRGB)
format = VK_FORMAT_R8G8B8A8_UNORM;
return format;
}
#ifdef __cplusplus
}
#endif
#endif /* VK_TEXCOMPRESS_ETC2_H */