1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkUtil.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/gpu/GrDirectContext.h" 11cb93a386Sopenharmony_ci#include "src/core/SkTraceEvent.h" 12cb93a386Sopenharmony_ci#include "src/gpu/GrDataUtils.h" 13cb93a386Sopenharmony_ci#include "src/gpu/GrDirectContextPriv.h" 14cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkGpu.h" 15cb93a386Sopenharmony_ci#include "src/sksl/SkSLCompiler.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cibool GrVkFormatIsSupported(VkFormat format) { 18cb93a386Sopenharmony_ci switch (format) { 19cb93a386Sopenharmony_ci case VK_FORMAT_R8G8B8A8_UNORM: 20cb93a386Sopenharmony_ci case VK_FORMAT_B8G8R8A8_UNORM: 21cb93a386Sopenharmony_ci case VK_FORMAT_R8G8B8A8_SRGB: 22cb93a386Sopenharmony_ci case VK_FORMAT_R8G8B8_UNORM: 23cb93a386Sopenharmony_ci case VK_FORMAT_R8G8_UNORM: 24cb93a386Sopenharmony_ci case VK_FORMAT_A2B10G10R10_UNORM_PACK32: 25cb93a386Sopenharmony_ci case VK_FORMAT_A2R10G10B10_UNORM_PACK32: 26cb93a386Sopenharmony_ci case VK_FORMAT_R5G6B5_UNORM_PACK16: 27cb93a386Sopenharmony_ci case VK_FORMAT_B4G4R4A4_UNORM_PACK16: 28cb93a386Sopenharmony_ci case VK_FORMAT_R4G4B4A4_UNORM_PACK16: 29cb93a386Sopenharmony_ci case VK_FORMAT_R8_UNORM: 30cb93a386Sopenharmony_ci case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: 31cb93a386Sopenharmony_ci case VK_FORMAT_BC1_RGB_UNORM_BLOCK: 32cb93a386Sopenharmony_ci case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: 33cb93a386Sopenharmony_ci case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: 34cb93a386Sopenharmony_ci case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: 35cb93a386Sopenharmony_ci case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: 36cb93a386Sopenharmony_ci case VK_FORMAT_R16G16B16A16_SFLOAT: 37cb93a386Sopenharmony_ci case VK_FORMAT_R16_SFLOAT: 38cb93a386Sopenharmony_ci case VK_FORMAT_R16_UNORM: 39cb93a386Sopenharmony_ci case VK_FORMAT_R16G16_UNORM: 40cb93a386Sopenharmony_ci case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM: 41cb93a386Sopenharmony_ci case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: 42cb93a386Sopenharmony_ci case VK_FORMAT_R16G16B16A16_UNORM: 43cb93a386Sopenharmony_ci case VK_FORMAT_R16G16_SFLOAT: 44cb93a386Sopenharmony_ci case VK_FORMAT_S8_UINT: 45cb93a386Sopenharmony_ci case VK_FORMAT_D24_UNORM_S8_UINT: 46cb93a386Sopenharmony_ci case VK_FORMAT_D32_SFLOAT_S8_UINT: 47cb93a386Sopenharmony_ci return true; 48cb93a386Sopenharmony_ci default: 49cb93a386Sopenharmony_ci return false; 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci} 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_cibool GrVkFormatNeedsYcbcrSampler(VkFormat format) { 54cb93a386Sopenharmony_ci return format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM || 55cb93a386Sopenharmony_ci format == VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM; 56cb93a386Sopenharmony_ci} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_cibool GrSampleCountToVkSampleCount(uint32_t samples, VkSampleCountFlagBits* vkSamples) { 59cb93a386Sopenharmony_ci SkASSERT(samples >= 1); 60cb93a386Sopenharmony_ci switch (samples) { 61cb93a386Sopenharmony_ci case 1: 62cb93a386Sopenharmony_ci *vkSamples = VK_SAMPLE_COUNT_1_BIT; 63cb93a386Sopenharmony_ci return true; 64cb93a386Sopenharmony_ci case 2: 65cb93a386Sopenharmony_ci *vkSamples = VK_SAMPLE_COUNT_2_BIT; 66cb93a386Sopenharmony_ci return true; 67cb93a386Sopenharmony_ci case 4: 68cb93a386Sopenharmony_ci *vkSamples = VK_SAMPLE_COUNT_4_BIT; 69cb93a386Sopenharmony_ci return true; 70cb93a386Sopenharmony_ci case 8: 71cb93a386Sopenharmony_ci *vkSamples = VK_SAMPLE_COUNT_8_BIT; 72cb93a386Sopenharmony_ci return true; 73cb93a386Sopenharmony_ci case 16: 74cb93a386Sopenharmony_ci *vkSamples = VK_SAMPLE_COUNT_16_BIT; 75cb93a386Sopenharmony_ci return true; 76cb93a386Sopenharmony_ci default: 77cb93a386Sopenharmony_ci return false; 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci} 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ciSkSL::ProgramKind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) { 82cb93a386Sopenharmony_ci if (VK_SHADER_STAGE_VERTEX_BIT == stage) { 83cb93a386Sopenharmony_ci return SkSL::ProgramKind::kVertex; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); 86cb93a386Sopenharmony_ci return SkSL::ProgramKind::kFragment; 87cb93a386Sopenharmony_ci} 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_cibool GrCompileVkShaderModule(GrVkGpu* gpu, 90cb93a386Sopenharmony_ci const SkSL::String& shaderString, 91cb93a386Sopenharmony_ci VkShaderStageFlagBits stage, 92cb93a386Sopenharmony_ci VkShaderModule* shaderModule, 93cb93a386Sopenharmony_ci VkPipelineShaderStageCreateInfo* stageInfo, 94cb93a386Sopenharmony_ci const SkSL::Program::Settings& settings, 95cb93a386Sopenharmony_ci SkSL::String* outSPIRV, 96cb93a386Sopenharmony_ci SkSL::Program::Inputs* outInputs) { 97cb93a386Sopenharmony_ci#ifndef SKIA_OHOS_DEBUG 98cb93a386Sopenharmony_ci SKIA_OHOS_TRACE_PRIV("skia.shaders", "OHOS_CompileSpriV"); 99cb93a386Sopenharmony_ci#endif 100cb93a386Sopenharmony_ci TRACE_EVENT0("skia.shaders", "CompileVkShaderModule"); 101cb93a386Sopenharmony_ci auto errorHandler = gpu->getContext()->priv().getShaderErrorHandler(); 102cb93a386Sopenharmony_ci std::unique_ptr<SkSL::Program> program = gpu->shaderCompiler()->convertProgram( 103cb93a386Sopenharmony_ci vk_shader_stage_to_skiasl_kind(stage), shaderString, settings); 104cb93a386Sopenharmony_ci if (!program) { 105cb93a386Sopenharmony_ci errorHandler->compileError(shaderString.c_str(), 106cb93a386Sopenharmony_ci gpu->shaderCompiler()->errorText().c_str()); 107cb93a386Sopenharmony_ci return false; 108cb93a386Sopenharmony_ci } 109cb93a386Sopenharmony_ci *outInputs = program->fInputs; 110cb93a386Sopenharmony_ci if (!gpu->shaderCompiler()->toSPIRV(*program, outSPIRV)) { 111cb93a386Sopenharmony_ci errorHandler->compileError(shaderString.c_str(), 112cb93a386Sopenharmony_ci gpu->shaderCompiler()->errorText().c_str()); 113cb93a386Sopenharmony_ci return false; 114cb93a386Sopenharmony_ci } 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci return GrInstallVkShaderModule(gpu, *outSPIRV, stage, shaderModule, stageInfo); 117cb93a386Sopenharmony_ci} 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_cibool GrInstallVkShaderModule(GrVkGpu* gpu, 120cb93a386Sopenharmony_ci const SkSL::String& spirv, 121cb93a386Sopenharmony_ci VkShaderStageFlagBits stage, 122cb93a386Sopenharmony_ci VkShaderModule* shaderModule, 123cb93a386Sopenharmony_ci VkPipelineShaderStageCreateInfo* stageInfo) { 124cb93a386Sopenharmony_ci TRACE_EVENT0("skia.shaders", "InstallVkShaderModule"); 125cb93a386Sopenharmony_ci VkShaderModuleCreateInfo moduleCreateInfo; 126cb93a386Sopenharmony_ci memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo)); 127cb93a386Sopenharmony_ci moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; 128cb93a386Sopenharmony_ci moduleCreateInfo.pNext = nullptr; 129cb93a386Sopenharmony_ci moduleCreateInfo.flags = 0; 130cb93a386Sopenharmony_ci moduleCreateInfo.codeSize = spirv.size(); 131cb93a386Sopenharmony_ci moduleCreateInfo.pCode = (const uint32_t*)spirv.c_str(); 132cb93a386Sopenharmony_ci 133cb93a386Sopenharmony_ci VkResult err; 134cb93a386Sopenharmony_ci GR_VK_CALL_RESULT(gpu, err, CreateShaderModule(gpu->device(), &moduleCreateInfo, nullptr, 135cb93a386Sopenharmony_ci shaderModule)); 136cb93a386Sopenharmony_ci if (err) { 137cb93a386Sopenharmony_ci return false; 138cb93a386Sopenharmony_ci } 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo)); 141cb93a386Sopenharmony_ci stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 142cb93a386Sopenharmony_ci stageInfo->pNext = nullptr; 143cb93a386Sopenharmony_ci stageInfo->flags = 0; 144cb93a386Sopenharmony_ci stageInfo->stage = stage; 145cb93a386Sopenharmony_ci stageInfo->module = *shaderModule; 146cb93a386Sopenharmony_ci stageInfo->pName = "main"; 147cb93a386Sopenharmony_ci stageInfo->pSpecializationInfo = nullptr; 148cb93a386Sopenharmony_ci 149cb93a386Sopenharmony_ci return true; 150cb93a386Sopenharmony_ci} 151cb93a386Sopenharmony_ci 152cb93a386Sopenharmony_cibool GrVkFormatIsCompressed(VkFormat vkFormat) { 153cb93a386Sopenharmony_ci switch (vkFormat) { 154cb93a386Sopenharmony_ci case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK: 155cb93a386Sopenharmony_ci case VK_FORMAT_BC1_RGB_UNORM_BLOCK: 156cb93a386Sopenharmony_ci case VK_FORMAT_BC1_RGBA_UNORM_BLOCK: 157cb93a386Sopenharmony_ci case VK_FORMAT_ASTC_4x4_UNORM_BLOCK: 158cb93a386Sopenharmony_ci case VK_FORMAT_ASTC_6x6_UNORM_BLOCK: 159cb93a386Sopenharmony_ci case VK_FORMAT_ASTC_8x8_UNORM_BLOCK: 160cb93a386Sopenharmony_ci return true; 161cb93a386Sopenharmony_ci default: 162cb93a386Sopenharmony_ci return false; 163cb93a386Sopenharmony_ci } 164cb93a386Sopenharmony_ci SkUNREACHABLE; 165cb93a386Sopenharmony_ci} 166