Home | History | Annotate | Download | only in vk
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "GrVkUtil.h"
      9 
     10 #include "vk/GrVkGpu.h"
     11 #include "SkSLCompiler.h"
     12 
     13 bool GrPixelConfigToVkFormat(GrPixelConfig config, VkFormat* format) {
     14     VkFormat dontCare;
     15     if (!format) {
     16         format = &dontCare;
     17     }
     18 
     19     switch (config) {
     20         case kUnknown_GrPixelConfig:
     21             return false;
     22         case kRGBA_8888_GrPixelConfig:
     23             *format = VK_FORMAT_R8G8B8A8_UNORM;
     24             return true;
     25         case kBGRA_8888_GrPixelConfig:
     26             *format = VK_FORMAT_B8G8R8A8_UNORM;
     27             return true;
     28         case kSRGBA_8888_GrPixelConfig:
     29             *format = VK_FORMAT_R8G8B8A8_SRGB;
     30             return true;
     31         case kSBGRA_8888_GrPixelConfig:
     32             *format = VK_FORMAT_B8G8R8A8_SRGB;
     33             return true;
     34         case kRGBA_8888_sint_GrPixelConfig:
     35             *format = VK_FORMAT_R8G8B8A8_SINT;
     36             return true;
     37         case kRGB_565_GrPixelConfig:
     38             *format = VK_FORMAT_R5G6B5_UNORM_PACK16;
     39             return true;
     40         case kRGBA_4444_GrPixelConfig:
     41             // R4G4B4A4 is not required to be supported so we actually
     42             // store the data is if it was B4G4R4A4 and swizzle in shaders
     43             *format = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
     44             return true;
     45         case kAlpha_8_GrPixelConfig:
     46             *format = VK_FORMAT_R8_UNORM;
     47             return true;
     48         case kGray_8_GrPixelConfig:
     49             *format = VK_FORMAT_R8_UNORM;
     50             return true;
     51         case kRGBA_float_GrPixelConfig:
     52             *format = VK_FORMAT_R32G32B32A32_SFLOAT;
     53             return true;
     54         case kRG_float_GrPixelConfig:
     55             *format = VK_FORMAT_R32G32_SFLOAT;
     56             return true;
     57         case kRGBA_half_GrPixelConfig:
     58             *format = VK_FORMAT_R16G16B16A16_SFLOAT;
     59             return true;
     60         case kAlpha_half_GrPixelConfig:
     61             *format = VK_FORMAT_R16_SFLOAT;
     62             return true;
     63     }
     64     SkFAIL("Unexpected config");
     65     return false;
     66 }
     67 
     68 GrPixelConfig GrVkFormatToPixelConfig(VkFormat format) {
     69     switch (format) {
     70         case VK_FORMAT_R8G8B8A8_UNORM:
     71             return kRGBA_8888_GrPixelConfig;
     72         case VK_FORMAT_B8G8R8A8_UNORM:
     73             return kBGRA_8888_GrPixelConfig;
     74         case VK_FORMAT_R8G8B8A8_SRGB:
     75             return kSRGBA_8888_GrPixelConfig;
     76         case VK_FORMAT_B8G8R8A8_SRGB:
     77             return kSBGRA_8888_GrPixelConfig;
     78         case VK_FORMAT_R8G8B8A8_SINT:
     79             return kRGBA_8888_sint_GrPixelConfig;
     80         case VK_FORMAT_R5G6B5_UNORM_PACK16:
     81             return kRGB_565_GrPixelConfig;
     82             break;
     83         case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
     84             // R4G4B4A4 is not required to be supported so we actually
     85             // store RGBA_4444 data as B4G4R4A4.
     86             return kRGBA_4444_GrPixelConfig;
     87         case VK_FORMAT_R8_UNORM:
     88             return kAlpha_8_GrPixelConfig;
     89         case VK_FORMAT_R32G32B32A32_SFLOAT:
     90             return kRGBA_float_GrPixelConfig;
     91         case VK_FORMAT_R32G32_SFLOAT:
     92             return kRG_float_GrPixelConfig;
     93         case VK_FORMAT_R16G16B16A16_SFLOAT:
     94             return kRGBA_half_GrPixelConfig;
     95         case VK_FORMAT_R16_SFLOAT:
     96             return kAlpha_half_GrPixelConfig;
     97         default:
     98             return kUnknown_GrPixelConfig;
     99     }
    100 }
    101 
    102 bool GrVkFormatIsSRGB(VkFormat format, VkFormat* linearFormat) {
    103     VkFormat linearFmt = format;
    104     switch (format) {
    105         case VK_FORMAT_R8_SRGB:
    106             linearFmt = VK_FORMAT_R8_UNORM;
    107             break;
    108         case VK_FORMAT_R8G8_SRGB:
    109             linearFmt = VK_FORMAT_R8G8_UNORM;
    110             break;
    111         case VK_FORMAT_R8G8B8_SRGB:
    112             linearFmt = VK_FORMAT_R8G8B8_UNORM;
    113             break;
    114         case VK_FORMAT_B8G8R8_SRGB:
    115             linearFmt = VK_FORMAT_B8G8R8_UNORM;
    116             break;
    117         case VK_FORMAT_R8G8B8A8_SRGB:
    118             linearFmt = VK_FORMAT_R8G8B8A8_UNORM;
    119             break;
    120         case VK_FORMAT_B8G8R8A8_SRGB:
    121             linearFmt = VK_FORMAT_B8G8R8A8_UNORM;
    122             break;
    123         case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
    124             linearFmt = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
    125             break;
    126         case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
    127             linearFmt = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
    128             break;
    129         case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
    130             linearFmt = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
    131             break;
    132         case VK_FORMAT_BC2_SRGB_BLOCK:
    133             linearFmt = VK_FORMAT_BC2_UNORM_BLOCK;
    134             break;
    135         case VK_FORMAT_BC3_SRGB_BLOCK:
    136             linearFmt = VK_FORMAT_BC3_UNORM_BLOCK;
    137             break;
    138         case VK_FORMAT_BC7_SRGB_BLOCK:
    139             linearFmt = VK_FORMAT_BC7_UNORM_BLOCK;
    140             break;
    141         case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
    142             linearFmt = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
    143             break;
    144         case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
    145             linearFmt = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
    146             break;
    147         case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
    148             linearFmt = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
    149             break;
    150         case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
    151             linearFmt = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
    152             break;
    153         case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
    154             linearFmt = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
    155             break;
    156         case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
    157             linearFmt = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
    158             break;
    159         case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
    160             linearFmt = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
    161             break;
    162         case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
    163             linearFmt = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
    164             break;
    165         case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
    166             linearFmt = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
    167             break;
    168         case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
    169             linearFmt = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
    170             break;
    171         case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
    172             linearFmt = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
    173             break;
    174         case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
    175             linearFmt = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
    176             break;
    177         case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
    178             linearFmt = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
    179             break;
    180         case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
    181             linearFmt = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
    182             break;
    183         case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
    184             linearFmt = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
    185             break;
    186         case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
    187             linearFmt = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
    188             break;
    189         case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
    190             linearFmt = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
    191             break;
    192         default:
    193             break;
    194     }
    195     if (linearFormat) {
    196         *linearFormat = linearFmt;
    197     }
    198     return (linearFmt != format);
    199 }
    200 
    201 bool GrSampleCountToVkSampleCount(uint32_t samples, VkSampleCountFlagBits* vkSamples) {
    202     switch (samples) {
    203         case 0: // fall through
    204         case 1:
    205             *vkSamples = VK_SAMPLE_COUNT_1_BIT;
    206             return true;
    207         case 2:
    208             *vkSamples = VK_SAMPLE_COUNT_2_BIT;
    209             return true;
    210         case 4:
    211             *vkSamples = VK_SAMPLE_COUNT_4_BIT;
    212             return true;
    213         case 8:
    214             *vkSamples = VK_SAMPLE_COUNT_8_BIT;
    215             return true;
    216         case 16:
    217             *vkSamples = VK_SAMPLE_COUNT_16_BIT;
    218             return true;
    219         case 32:
    220             *vkSamples = VK_SAMPLE_COUNT_32_BIT;
    221             return true;
    222         case 64:
    223             *vkSamples = VK_SAMPLE_COUNT_64_BIT;
    224             return true;
    225         default:
    226             return false;
    227     }
    228 }
    229 
    230 SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
    231     if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
    232         return SkSL::Program::kVertex_Kind;
    233     }
    234     if (VK_SHADER_STAGE_GEOMETRY_BIT == stage) {
    235         return SkSL::Program::kGeometry_Kind;
    236     }
    237     SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
    238     return SkSL::Program::kFragment_Kind;
    239 }
    240 
    241 VkShaderStageFlagBits skiasl_kind_to_vk_shader_stage(SkSL::Program::Kind kind) {
    242     if (SkSL::Program::kVertex_Kind == kind) {
    243         return VK_SHADER_STAGE_VERTEX_BIT;
    244     }
    245     if (SkSL::Program::kGeometry_Kind == kind) {
    246         return VK_SHADER_STAGE_GEOMETRY_BIT;
    247     }
    248     SkASSERT(SkSL::Program::kFragment_Kind == kind);
    249     return VK_SHADER_STAGE_FRAGMENT_BIT;
    250 }
    251 
    252 bool GrCompileVkShaderModule(const GrVkGpu* gpu,
    253                              const char* shaderString,
    254                              VkShaderStageFlagBits stage,
    255                              VkShaderModule* shaderModule,
    256                              VkPipelineShaderStageCreateInfo* stageInfo,
    257                              const SkSL::Program::Settings& settings,
    258                              SkSL::Program::Inputs* outInputs) {
    259     std::unique_ptr<SkSL::Program> program = gpu->shaderCompiler()->convertProgram(
    260                                                               vk_shader_stage_to_skiasl_kind(stage),
    261                                                               SkString(shaderString),
    262                                                               settings);
    263     if (!program) {
    264         SkDebugf("SkSL error:\n%s\n", gpu->shaderCompiler()->errorText().c_str());
    265         SkASSERT(false);
    266     }
    267     *outInputs = program->fInputs;
    268     SkSL::String code;
    269     if (!gpu->shaderCompiler()->toSPIRV(*program, &code)) {
    270         SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str());
    271         return false;
    272     }
    273 
    274     VkShaderModuleCreateInfo moduleCreateInfo;
    275     memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
    276     moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
    277     moduleCreateInfo.pNext = nullptr;
    278     moduleCreateInfo.flags = 0;
    279     moduleCreateInfo.codeSize = code.size();
    280     moduleCreateInfo.pCode = (const uint32_t*)code.c_str();
    281 
    282     VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device(),
    283                                                                      &moduleCreateInfo,
    284                                                                      nullptr,
    285                                                                      shaderModule));
    286     if (err) {
    287         return false;
    288     }
    289 
    290     memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
    291     stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
    292     stageInfo->pNext = nullptr;
    293     stageInfo->flags = 0;
    294     stageInfo->stage = skiasl_kind_to_vk_shader_stage(program->fKind);
    295     stageInfo->module = *shaderModule;
    296     stageInfo->pName = "main";
    297     stageInfo->pSpecializationInfo = nullptr;
    298 
    299     return true;
    300 }
    301