Edit

IABSD.fr/xenocara/lib/mesa/src/vulkan/runtime/vk_texcompress_astc.h

Branch :

  • Show log

    Commit

  • Author : jsg
    Date : 2024-04-02 09:25:31
    Hash : 874d2ba3
    Message : Import Mesa 23.3.6

  • lib/mesa/src/vulkan/runtime/vk_texcompress_astc.h
  • /* 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;
    };
    
    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);
    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 */