Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/gpu/vk/GrVkPipelineStateBuilder.cpp

Issue 1984363002: initial checkin of SkSL compiler (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: cleanups Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "vk/GrVkPipelineStateBuilder.h" 8 #include "vk/GrVkPipelineStateBuilder.h"
9 9
10 #include "vk/GrVkGpu.h" 10 #include "vk/GrVkGpu.h"
11 #include "vk/GrVkRenderPass.h" 11 #include "vk/GrVkRenderPass.h"
12 #if USE_SKSL
13 #include "SkSLCompiler.h"
14 #endif
12 15
13 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState( 16 GrVkPipelineState* GrVkPipelineStateBuilder::CreatePipelineState(
14 GrVkGpu* gpu, 17 GrVkGpu* gpu,
15 const GrPipeline& pipeline, 18 const GrPipeline& pipeline,
16 const GrPrimitive Processor& primProc, 19 const GrPrimitive Processor& primProc,
17 GrPrimitiveType p rimitiveType, 20 GrPrimitiveType p rimitiveType,
18 const GrVkPipelin eState::Desc& desc, 21 const GrVkPipelin eState::Desc& desc,
19 const GrVkRenderP ass& renderPass) { 22 const GrVkRenderP ass& renderPass) {
20 // create a builder. This will be handed off to effects so they can use it to add 23 // create a builder. This will be handed off to effects so they can use it to add
21 // uniforms, varyings, textures, etc 24 // uniforms, varyings, textures, etc
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 } 68 }
66 if (visibility & kGeometry_GrShaderFlag) { 69 if (visibility & kGeometry_GrShaderFlag) {
67 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; 70 flags |= VK_SHADER_STAGE_GEOMETRY_BIT;
68 } 71 }
69 if (visibility & kFragment_GrShaderFlag) { 72 if (visibility & kFragment_GrShaderFlag) {
70 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; 73 flags |= VK_SHADER_STAGE_FRAGMENT_BIT;
71 } 74 }
72 return flags; 75 return flags;
73 } 76 }
74 77
78 #if USE_SKSL
79 SkSL::Program::Kind vk_shader_stage_to_skiasl_kind(VkShaderStageFlagBits stage) {
80 if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
81 return SkSL::Program::kVertex_Kind;
82 }
83 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
84 return SkSL::Program::kFragment_Kind;
85 }
86 #else
75 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage) { 87 shaderc_shader_kind vk_shader_stage_to_shaderc_kind(VkShaderStageFlagBits stage) {
76 if (VK_SHADER_STAGE_VERTEX_BIT == stage) { 88 if (VK_SHADER_STAGE_VERTEX_BIT == stage) {
77 return shaderc_glsl_vertex_shader; 89 return shaderc_glsl_vertex_shader;
78 } 90 }
79 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage); 91 SkASSERT(VK_SHADER_STAGE_FRAGMENT_BIT == stage);
80 return shaderc_glsl_fragment_shader; 92 return shaderc_glsl_fragment_shader;
81 } 93 }
94 #endif
82 95
96 #include <fstream>
97 #include <sstream>
83 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu, 98 bool GrVkPipelineStateBuilder::CreateVkShaderModule(const GrVkGpu* gpu,
84 VkShaderStageFlagBits stage, 99 VkShaderStageFlagBits stage,
85 const GrGLSLShaderBuilder& b uilder, 100 const GrGLSLShaderBuilder& b uilder,
86 VkShaderModule* shaderModule , 101 VkShaderModule* shaderModule ,
87 VkPipelineShaderStageCreateI nfo* stageInfo) { 102 VkPipelineShaderStageCreateI nfo* stageInfo) {
103 std::stringstream buffer;
dogben 2016/06/20 16:23:17 Unused?
ethannicholas 2016/06/20 17:45:49 A bit of debug code I failed to remove. Oops!
dogben 2016/06/28 02:14:53 (Still there.)
88 SkString shaderString; 104 SkString shaderString;
89 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) { 105 for (int i = 0; i < builder.fCompilerStrings.count(); ++i) {
90 if (builder.fCompilerStrings[i]) { 106 if (builder.fCompilerStrings[i]) {
91 shaderString.append(builder.fCompilerStrings[i]); 107 shaderString.append(builder.fCompilerStrings[i]);
92 shaderString.append("\n"); 108 shaderString.append("\n");
93 } 109 }
94 } 110 }
95 111
96 VkShaderModuleCreateInfo moduleCreateInfo; 112 VkShaderModuleCreateInfo moduleCreateInfo;
97 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo)); 113 memset(&moduleCreateInfo, 0, sizeof(VkShaderModuleCreateInfo));
98 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; 114 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
99 moduleCreateInfo.pNext = nullptr; 115 moduleCreateInfo.pNext = nullptr;
100 moduleCreateInfo.flags = 0; 116 moduleCreateInfo.flags = 0;
101 117
118 #if USE_SKSL
119 std::string code;
120 #else
102 shaderc_compilation_result_t result = nullptr; 121 shaderc_compilation_result_t result = nullptr;
122 #endif
103 123
104 if (gpu->vkCaps().canUseGLSLForShaderModule()) { 124 if (gpu->vkCaps().canUseGLSLForShaderModule()) {
105 moduleCreateInfo.codeSize = strlen(shaderString.c_str()); 125 moduleCreateInfo.codeSize = strlen(shaderString.c_str());
106 moduleCreateInfo.pCode = (const uint32_t*)shaderString.c_str(); 126 moduleCreateInfo.pCode = (const uint32_t*)shaderString.c_str();
107 } else { 127 } else {
108 128
129 #if USE_SKSL
130 bool result = gpu->shaderCompiler()->toSPIRV(vk_shader_stage_to_skiasl_k ind(stage),
131 std::string(shaderString.c_ str()),
132 &code);
133 if (!result) {
134 SkDebugf("%s\n", gpu->shaderCompiler()->errorText().c_str());
135 return false;
136 }
137 moduleCreateInfo.codeSize = code.size();
138 moduleCreateInfo.pCode = (const uint32_t*) code.c_str();
139 #else
109 shaderc_compiler_t compiler = gpu->shadercCompiler(); 140 shaderc_compiler_t compiler = gpu->shadercCompiler();
110 141
111 shaderc_compile_options_t options = shaderc_compile_options_initialize() ; 142 shaderc_compile_options_t options = shaderc_compile_options_initialize() ;
112 143
113 shaderc_shader_kind shadercStage = vk_shader_stage_to_shaderc_kind(stage ); 144 shaderc_shader_kind shadercStage = vk_shader_stage_to_shaderc_kind(stage );
114 result = shaderc_compile_into_spv(compiler, 145 result = shaderc_compile_into_spv(compiler,
115 shaderString.c_str(), 146 shaderString.c_str(),
116 strlen(shaderString.c_str()), 147 strlen(shaderString.c_str()),
117 shadercStage, 148 shadercStage,
118 "shader", 149 "shader",
119 "main", 150 "main",
120 options); 151 options);
121 shaderc_compile_options_release(options); 152 shaderc_compile_options_release(options);
122 #ifdef SK_DEBUG 153 #ifdef SK_DEBUG
123 if (shaderc_result_get_num_errors(result)) { 154 if (shaderc_result_get_num_errors(result)) {
124 SkDebugf("%s\n", shaderString.c_str()); 155 SkDebugf("%s\n", shaderString.c_str());
125 SkDebugf("%s\n", shaderc_result_get_error_message(result)); 156 SkDebugf("%s\n", shaderc_result_get_error_message(result));
126 return false; 157 return false;
127 } 158 }
128 #endif 159 #endif // SK_DEBUG
129 160
130 moduleCreateInfo.codeSize = shaderc_result_get_length(result); 161 moduleCreateInfo.codeSize = shaderc_result_get_length(result);
131 moduleCreateInfo.pCode = (const uint32_t*)shaderc_result_get_bytes(resul t); 162 moduleCreateInfo.pCode = (const uint32_t*)shaderc_result_get_bytes(resul t);
163 #endif // USE_SKSL
132 } 164 }
133 165
134 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device (), 166 VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateShaderModule(gpu->device (),
135 &moduleCrea teInfo, 167 &moduleCrea teInfo,
136 nullptr, 168 nullptr,
137 shaderModul e)); 169 shaderModul e));
170
138 if (!gpu->vkCaps().canUseGLSLForShaderModule()) { 171 if (!gpu->vkCaps().canUseGLSLForShaderModule()) {
172 #if !USE_SKSL
139 shaderc_result_release(result); 173 shaderc_result_release(result);
174 #endif
140 } 175 }
141 if (err) { 176 if (err) {
142 return false; 177 return false;
143 } 178 }
144 179
145 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo)); 180 memset(stageInfo, 0, sizeof(VkPipelineShaderStageCreateInfo));
146 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; 181 stageInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
147 stageInfo->pNext = nullptr; 182 stageInfo->pNext = nullptr;
148 stageInfo->flags = 0; 183 stageInfo->flags = 0;
149 stageInfo->stage = stage; 184 stageInfo->stage = stage;
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 dsLayout[GrVkUniformHandler::kSamplerDescSet], 301 dsLayout[GrVkUniformHandler::kSamplerDescSet],
267 fUniformHandles, 302 fUniformHandles,
268 fUniformHandler.fUniforms, 303 fUniformHandler.fUniforms,
269 fUniformHandler.fCurrentVertexUBOOffset, 304 fUniformHandler.fCurrentVertexUBOOffset,
270 fUniformHandler.fCurrentFragmentUBOOffset, 305 fUniformHandler.fCurrentFragmentUBOOffset,
271 numSamplers, 306 numSamplers,
272 fGeometryProcessor, 307 fGeometryProcessor,
273 fXferProcessor, 308 fXferProcessor,
274 fFragmentProcessors); 309 fFragmentProcessors);
275 } 310 }
OLDNEW
« no previous file with comments | « src/gpu/vk/GrVkGpu.cpp ('k') | src/sksl/GLSL.std.450.h » ('j') | src/sksl/SkSLToken.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698