mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-21 17:38:08 +02:00
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33505>
136 lines
5.9 KiB
C
136 lines
5.9 KiB
C
/* Copyright (c) 2017-2023 Hans-Kristian Arntzen
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
#ifndef VK_TEXCOMPRESS_ASTC_H
|
|
#define VK_TEXCOMPRESS_ASTC_H
|
|
|
|
#include "vk_device.h"
|
|
|
|
/* luts order matching astc glsl shader below,
|
|
* 0 - color endpoint
|
|
* 1 - color endpoint unquant
|
|
* 2 - weights
|
|
* 3 - weights unquant
|
|
* 4 - trits quints
|
|
*/
|
|
#define VK_TEXCOMPRESS_ASTC_NUM_LUTS 5
|
|
#define VK_TEXCOMPRESS_ASTC_NUM_PARTITION_TABLES 14
|
|
#define VK_TEXCOMPRESS_ASTC_WRITE_DESC_SET_COUNT 8
|
|
|
|
struct vk_texcompress_astc_state {
|
|
/* single buffer is allocated for all luts */
|
|
VkDeviceMemory luts_mem;
|
|
VkBuffer luts_buf;
|
|
|
|
VkBufferView luts_buf_view[VK_TEXCOMPRESS_ASTC_NUM_LUTS];
|
|
VkBufferView partition_tbl_buf_view[VK_TEXCOMPRESS_ASTC_NUM_PARTITION_TABLES];
|
|
|
|
simple_mtx_t mutex;
|
|
VkDescriptorSetLayout ds_layout;
|
|
VkPipelineLayout p_layout;
|
|
VkPipeline pipeline[VK_TEXCOMPRESS_ASTC_NUM_PARTITION_TABLES];
|
|
uint32_t pipeline_mask;
|
|
VkShaderModule shader_module;
|
|
};
|
|
|
|
struct vk_texcompress_astc_write_descriptor_set {
|
|
VkWriteDescriptorSet descriptor_set[VK_TEXCOMPRESS_ASTC_WRITE_DESC_SET_COUNT];
|
|
VkDescriptorImageInfo dst_desc_image_info;
|
|
VkDescriptorImageInfo src_desc_image_info;
|
|
};
|
|
|
|
struct vk_texcompress_astc_write_descriptor_buffer {
|
|
VkDescriptorGetInfoEXT descriptors[VK_TEXCOMPRESS_ASTC_WRITE_DESC_SET_COUNT];
|
|
VkDescriptorAddressInfoEXT luts_desc_addr_info[VK_TEXCOMPRESS_ASTC_NUM_LUTS];
|
|
VkDescriptorAddressInfoEXT partition_tbl_desc_addr_info;
|
|
VkDescriptorImageInfo dst_desc_image_info;
|
|
VkDescriptorImageInfo src_desc_image_info;
|
|
};
|
|
|
|
void
|
|
vk_texcompress_astc_fill_write_descriptor_sets(struct vk_texcompress_astc_state *astc,
|
|
struct vk_texcompress_astc_write_descriptor_set *set,
|
|
VkImageView src_img_view, VkImageLayout src_img_layout,
|
|
VkImageView dst_img_view,
|
|
VkFormat format);
|
|
void
|
|
vk_texcompress_astc_fill_write_descriptor_buffer(struct vk_device *device,
|
|
struct vk_texcompress_astc_state *astc,
|
|
struct vk_texcompress_astc_write_descriptor_buffer *buffer,
|
|
VkImageView src_img_view, VkImageLayout src_img_layout,
|
|
VkImageView dst_img_view,
|
|
VkFormat format);
|
|
VkPipeline vk_texcompress_astc_get_decode_pipeline(struct vk_device *device,
|
|
VkAllocationCallbacks *allocator,
|
|
struct vk_texcompress_astc_state *astc,
|
|
VkPipelineCache pipeline_cache,
|
|
VkFormat format);
|
|
VkResult vk_texcompress_astc_init(struct vk_device *device,
|
|
VkAllocationCallbacks *allocator,
|
|
VkPipelineCache pipeline_cache,
|
|
struct vk_texcompress_astc_state **astc);
|
|
void vk_texcompress_astc_finish(struct vk_device *device,
|
|
VkAllocationCallbacks *allocator,
|
|
struct vk_texcompress_astc_state *astc);
|
|
|
|
static inline VkFormat
|
|
vk_texcompress_astc_emulation_format(VkFormat format)
|
|
{
|
|
/* TODO: From VK_EXT_astc_Decode_mode spec, VK_FORMAT_R16G16B16A16_SFLOAT is the default
|
|
* option. VK_FORMAT_R8G8B8A8_UNORM is only acceptable image quality option.
|
|
*/
|
|
switch (format) {
|
|
case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
|
|
case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
|
|
return VK_FORMAT_R8G8B8A8_UNORM;
|
|
case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
|
|
case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
|
|
return VK_FORMAT_R8G8B8A8_SRGB;
|
|
default:
|
|
return VK_FORMAT_UNDEFINED;
|
|
}
|
|
}
|
|
|
|
#endif /* VK_TEXCOMPRESS_ASTC_H */
|