blob: a7bb840e9c39760f2a910341e27833c2254ab48f [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
2* Copyright 2016 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
Greg Daniela8c32102020-12-30 15:09:32 -05008#include "src/gpu/vk/GrVkPipeline.h"
9
Brian Osman7a20b5c2021-03-15 16:23:33 -040010#include "src/core/SkTraceEvent.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/GrGeometryProcessor.h"
12#include "src/gpu/GrPipeline.h"
13#include "src/gpu/GrStencilSettings.h"
14#include "src/gpu/vk/GrVkCommandBuffer.h"
15#include "src/gpu/vk/GrVkGpu.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#include "src/gpu/vk/GrVkRenderTarget.h"
17#include "src/gpu/vk/GrVkUtil.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018
Ben Wagner6c30e742019-02-06 10:46:14 -050019#if defined(SK_ENABLE_SCOPED_LSAN_SUPPRESSIONS)
20#include <sanitizer/lsan_interface.h>
21#endif
22
csmartdaltonb37cb232017-02-08 14:56:27 -050023static inline VkFormat attrib_type_to_vkformat(GrVertexAttribType type) {
24 switch (type) {
25 case kFloat_GrVertexAttribType:
26 return VK_FORMAT_R32_SFLOAT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040027 case kFloat2_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050028 return VK_FORMAT_R32G32_SFLOAT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040029 case kFloat3_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050030 return VK_FORMAT_R32G32B32_SFLOAT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040031 case kFloat4_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050032 return VK_FORMAT_R32G32B32A32_SFLOAT;
Brian Osmand4c29702018-09-14 16:16:55 -040033 case kHalf_GrVertexAttribType:
34 return VK_FORMAT_R16_SFLOAT;
35 case kHalf2_GrVertexAttribType:
36 return VK_FORMAT_R16G16_SFLOAT;
Brian Osmand4c29702018-09-14 16:16:55 -040037 case kHalf4_GrVertexAttribType:
38 return VK_FORMAT_R16G16B16A16_SFLOAT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040039 case kInt2_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050040 return VK_FORMAT_R32G32_SINT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040041 case kInt3_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050042 return VK_FORMAT_R32G32B32_SINT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040043 case kInt4_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050044 return VK_FORMAT_R32G32B32A32_SINT;
Ruiqi Maob609e6d2018-07-17 10:19:38 -040045 case kByte_GrVertexAttribType:
46 return VK_FORMAT_R8_SINT;
47 case kByte2_GrVertexAttribType:
48 return VK_FORMAT_R8G8_SINT;
Ruiqi Maob609e6d2018-07-17 10:19:38 -040049 case kByte4_GrVertexAttribType:
50 return VK_FORMAT_R8G8B8A8_SINT;
51 case kUByte_GrVertexAttribType:
52 return VK_FORMAT_R8_UINT;
53 case kUByte2_GrVertexAttribType:
54 return VK_FORMAT_R8G8_UINT;
Ruiqi Maob609e6d2018-07-17 10:19:38 -040055 case kUByte4_GrVertexAttribType:
56 return VK_FORMAT_R8G8B8A8_UINT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040057 case kUByte_norm_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050058 return VK_FORMAT_R8_UNORM;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040059 case kUByte4_norm_GrVertexAttribType:
csmartdaltonb37cb232017-02-08 14:56:27 -050060 return VK_FORMAT_R8G8B8A8_UNORM;
Chris Daltona045eea2017-10-24 13:22:10 -060061 case kShort2_GrVertexAttribType:
62 return VK_FORMAT_R16G16_SINT;
Brian Osmana5c578f2018-09-19 14:19:02 -040063 case kShort4_GrVertexAttribType:
64 return VK_FORMAT_R16G16B16A16_SINT;
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040065 case kUShort2_GrVertexAttribType:
Robert Phillips8296e752017-08-25 08:45:21 -040066 return VK_FORMAT_R16G16_UINT;
Chris Daltona045eea2017-10-24 13:22:10 -060067 case kUShort2_norm_GrVertexAttribType:
68 return VK_FORMAT_R16G16_UNORM;
csmartdaltonb37cb232017-02-08 14:56:27 -050069 case kInt_GrVertexAttribType:
70 return VK_FORMAT_R32_SINT;
71 case kUint_GrVertexAttribType:
72 return VK_FORMAT_R32_UINT;
Robert Phillipsfe18de52019-06-06 17:21:50 -040073 case kUShort_norm_GrVertexAttribType:
74 return VK_FORMAT_R16_UNORM;
Robert Phillips66a46032019-06-18 08:00:42 -040075 case kUShort4_norm_GrVertexAttribType:
76 return VK_FORMAT_R16G16B16A16_UNORM;
csmartdaltonb37cb232017-02-08 14:56:27 -050077 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040078 SK_ABORT("Unknown vertex attrib type");
Greg Daniel164a9f02016-02-22 09:56:40 -050079}
80
Greg Danielb39d0762020-12-30 15:02:34 -050081static void setup_vertex_input_state(
Robert Phillips787fd9d2021-03-22 14:48:09 -040082 const GrGeometryProcessor::AttributeSet& vertexAttribs,
83 const GrGeometryProcessor::AttributeSet& instanceAttribs,
Greg Danielb39d0762020-12-30 15:02:34 -050084 VkPipelineVertexInputStateCreateInfo* vertexInputInfo,
85 SkSTArray<2, VkVertexInputBindingDescription, true>* bindingDescs,
86 VkVertexInputAttributeDescription* attributeDesc) {
87 int vaCount = vertexAttribs.count();
88 int iaCount = instanceAttribs.count();
89
Kevin Lubick42846132018-01-05 10:11:11 -050090 uint32_t vertexBinding = 0, instanceBinding = 0;
Chris Dalton1d616352017-05-31 12:51:23 -060091
Brian Salomon92be2f72018-06-19 14:33:47 -040092 int nextBinding = bindingDescs->count();
Greg Danielb39d0762020-12-30 15:02:34 -050093 if (vaCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -040094 vertexBinding = nextBinding++;
Chris Dalton1d616352017-05-31 12:51:23 -060095 }
96
Greg Danielb39d0762020-12-30 15:02:34 -050097 if (iaCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -040098 instanceBinding = nextBinding;
Chris Dalton1d616352017-05-31 12:51:23 -060099 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500100
101 // setup attribute descriptions
Brian Salomon92be2f72018-06-19 14:33:47 -0400102 int attribIndex = 0;
103 size_t vertexAttributeOffset = 0;
Greg Danielb39d0762020-12-30 15:02:34 -0500104 for (const auto& attrib : vertexAttribs) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400105 VkVertexInputAttributeDescription& vkAttrib = attributeDesc[attribIndex];
Brian Osmanf04fb3c2018-11-12 15:34:00 -0500106 vkAttrib.location = attribIndex++; // for now assume location = attribIndex
Brian Salomon92be2f72018-06-19 14:33:47 -0400107 vkAttrib.binding = vertexBinding;
Brian Osmand4c29702018-09-14 16:16:55 -0400108 vkAttrib.format = attrib_type_to_vkformat(attrib.cpuType());
Brian Salomon92be2f72018-06-19 14:33:47 -0400109 vkAttrib.offset = vertexAttributeOffset;
Brian Salomon92be2f72018-06-19 14:33:47 -0400110 vertexAttributeOffset += attrib.sizeAlign4();
111 }
Greg Danielb39d0762020-12-30 15:02:34 -0500112 SkASSERT(vertexAttributeOffset == vertexAttribs.stride());
Brian Salomon92be2f72018-06-19 14:33:47 -0400113
Brian Salomon92be2f72018-06-19 14:33:47 -0400114 size_t instanceAttributeOffset = 0;
Greg Danielb39d0762020-12-30 15:02:34 -0500115 for (const auto& attrib : instanceAttribs) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400116 VkVertexInputAttributeDescription& vkAttrib = attributeDesc[attribIndex];
Brian Osmanf04fb3c2018-11-12 15:34:00 -0500117 vkAttrib.location = attribIndex++; // for now assume location = attribIndex
Brian Salomon92be2f72018-06-19 14:33:47 -0400118 vkAttrib.binding = instanceBinding;
Brian Osmand4c29702018-09-14 16:16:55 -0400119 vkAttrib.format = attrib_type_to_vkformat(attrib.cpuType());
Brian Salomon92be2f72018-06-19 14:33:47 -0400120 vkAttrib.offset = instanceAttributeOffset;
Brian Salomon92be2f72018-06-19 14:33:47 -0400121 instanceAttributeOffset += attrib.sizeAlign4();
122 }
Greg Danielb39d0762020-12-30 15:02:34 -0500123 SkASSERT(instanceAttributeOffset == instanceAttribs.stride());
Brian Salomon92be2f72018-06-19 14:33:47 -0400124
Greg Danielb39d0762020-12-30 15:02:34 -0500125 if (vaCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400126 bindingDescs->push_back() = {
127 vertexBinding,
128 (uint32_t) vertexAttributeOffset,
129 VK_VERTEX_INPUT_RATE_VERTEX
130 };
131 }
Greg Danielb39d0762020-12-30 15:02:34 -0500132 if (iaCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400133 bindingDescs->push_back() = {
134 instanceBinding,
135 (uint32_t) instanceAttributeOffset,
136 VK_VERTEX_INPUT_RATE_INSTANCE
137 };
Greg Daniel164a9f02016-02-22 09:56:40 -0500138 }
139
140 memset(vertexInputInfo, 0, sizeof(VkPipelineVertexInputStateCreateInfo));
141 vertexInputInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
142 vertexInputInfo->pNext = nullptr;
143 vertexInputInfo->flags = 0;
Chris Dalton1d616352017-05-31 12:51:23 -0600144 vertexInputInfo->vertexBindingDescriptionCount = bindingDescs->count();
145 vertexInputInfo->pVertexBindingDescriptions = bindingDescs->begin();
Brian Salomon92be2f72018-06-19 14:33:47 -0400146 vertexInputInfo->vertexAttributeDescriptionCount = vaCount + iaCount;
Greg Daniel164a9f02016-02-22 09:56:40 -0500147 vertexInputInfo->pVertexAttributeDescriptions = attributeDesc;
148}
149
Chris Dalton3809bab2017-06-13 10:55:06 -0600150static VkPrimitiveTopology gr_primitive_type_to_vk_topology(GrPrimitiveType primitiveType) {
151 switch (primitiveType) {
152 case GrPrimitiveType::kTriangles:
153 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
154 case GrPrimitiveType::kTriangleStrip:
155 return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
Chris Dalton3809bab2017-06-13 10:55:06 -0600156 case GrPrimitiveType::kPoints:
157 return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
158 case GrPrimitiveType::kLines:
159 return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
160 case GrPrimitiveType::kLineStrip:
161 return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
Chris Dalton5a2f9622019-12-27 14:56:38 -0700162 case GrPrimitiveType::kPatches:
Robert Phillips571177f2019-10-04 14:41:49 -0400163 case GrPrimitiveType::kPath:
164 SK_ABORT("Unsupported primitive type");
Chris Dalton3809bab2017-06-13 10:55:06 -0600165 }
Greg Danieled4e52c2020-04-13 14:35:19 -0400166 SkUNREACHABLE;
Chris Dalton3809bab2017-06-13 10:55:06 -0600167}
Greg Daniel164a9f02016-02-22 09:56:40 -0500168
169static void setup_input_assembly_state(GrPrimitiveType primitiveType,
170 VkPipelineInputAssemblyStateCreateInfo* inputAssemblyInfo) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500171 memset(inputAssemblyInfo, 0, sizeof(VkPipelineInputAssemblyStateCreateInfo));
172 inputAssemblyInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
173 inputAssemblyInfo->pNext = nullptr;
174 inputAssemblyInfo->flags = 0;
175 inputAssemblyInfo->primitiveRestartEnable = false;
Chris Dalton3809bab2017-06-13 10:55:06 -0600176 inputAssemblyInfo->topology = gr_primitive_type_to_vk_topology(primitiveType);
Greg Daniel164a9f02016-02-22 09:56:40 -0500177}
178
egdanielec440992016-09-13 09:54:11 -0700179static VkStencilOp stencil_op_to_vk_stencil_op(GrStencilOp op) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500180 static const VkStencilOp gTable[] = {
cdalton93a379b2016-05-11 13:58:08 -0700181 VK_STENCIL_OP_KEEP, // kKeep
182 VK_STENCIL_OP_ZERO, // kZero
183 VK_STENCIL_OP_REPLACE, // kReplace
184 VK_STENCIL_OP_INVERT, // kInvert
185 VK_STENCIL_OP_INCREMENT_AND_WRAP, // kIncWrap
186 VK_STENCIL_OP_DECREMENT_AND_WRAP, // kDecWrap
187 VK_STENCIL_OP_INCREMENT_AND_CLAMP, // kIncClamp
188 VK_STENCIL_OP_DECREMENT_AND_CLAMP, // kDecClamp
Greg Daniel164a9f02016-02-22 09:56:40 -0500189 };
Brian Salomon4dea72a2019-12-18 10:43:10 -0500190 static_assert(SK_ARRAY_COUNT(gTable) == kGrStencilOpCount);
191 static_assert(0 == (int)GrStencilOp::kKeep);
192 static_assert(1 == (int)GrStencilOp::kZero);
193 static_assert(2 == (int)GrStencilOp::kReplace);
194 static_assert(3 == (int)GrStencilOp::kInvert);
195 static_assert(4 == (int)GrStencilOp::kIncWrap);
196 static_assert(5 == (int)GrStencilOp::kDecWrap);
197 static_assert(6 == (int)GrStencilOp::kIncClamp);
198 static_assert(7 == (int)GrStencilOp::kDecClamp);
cdalton93a379b2016-05-11 13:58:08 -0700199 SkASSERT(op < (GrStencilOp)kGrStencilOpCount);
200 return gTable[(int)op];
Greg Daniel164a9f02016-02-22 09:56:40 -0500201}
202
egdanielec440992016-09-13 09:54:11 -0700203static VkCompareOp stencil_func_to_vk_compare_op(GrStencilTest test) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500204 static const VkCompareOp gTable[] = {
cdalton93a379b2016-05-11 13:58:08 -0700205 VK_COMPARE_OP_ALWAYS, // kAlways
206 VK_COMPARE_OP_NEVER, // kNever
207 VK_COMPARE_OP_GREATER, // kGreater
208 VK_COMPARE_OP_GREATER_OR_EQUAL, // kGEqual
209 VK_COMPARE_OP_LESS, // kLess
210 VK_COMPARE_OP_LESS_OR_EQUAL, // kLEqual
211 VK_COMPARE_OP_EQUAL, // kEqual
212 VK_COMPARE_OP_NOT_EQUAL, // kNotEqual
Greg Daniel164a9f02016-02-22 09:56:40 -0500213 };
Brian Salomon4dea72a2019-12-18 10:43:10 -0500214 static_assert(SK_ARRAY_COUNT(gTable) == kGrStencilTestCount);
215 static_assert(0 == (int)GrStencilTest::kAlways);
216 static_assert(1 == (int)GrStencilTest::kNever);
217 static_assert(2 == (int)GrStencilTest::kGreater);
218 static_assert(3 == (int)GrStencilTest::kGEqual);
219 static_assert(4 == (int)GrStencilTest::kLess);
220 static_assert(5 == (int)GrStencilTest::kLEqual);
221 static_assert(6 == (int)GrStencilTest::kEqual);
222 static_assert(7 == (int)GrStencilTest::kNotEqual);
cdalton93a379b2016-05-11 13:58:08 -0700223 SkASSERT(test < (GrStencilTest)kGrStencilTestCount);
Greg Daniel164a9f02016-02-22 09:56:40 -0500224
cdalton93a379b2016-05-11 13:58:08 -0700225 return gTable[(int)test];
Greg Daniel164a9f02016-02-22 09:56:40 -0500226}
227
Chris Dalton71713f62019-04-18 12:41:03 -0600228static void setup_stencil_op_state(
229 VkStencilOpState* opState, const GrStencilSettings::Face& stencilFace) {
230 opState->failOp = stencil_op_to_vk_stencil_op(stencilFace.fFailOp);
231 opState->passOp = stencil_op_to_vk_stencil_op(stencilFace.fPassOp);
232 opState->depthFailOp = opState->failOp;
233 opState->compareOp = stencil_func_to_vk_compare_op(stencilFace.fTest);
234 opState->compareMask = stencilFace.fTestMask;
235 opState->writeMask = stencilFace.fWriteMask;
236 opState->reference = stencilFace.fRef;
237}
238
Robert Phillips6c2aa7a2019-10-17 19:06:39 +0000239static void setup_depth_stencil_state(
Greg Danielb39d0762020-12-30 15:02:34 -0500240 const GrStencilSettings& stencilSettings,
241 GrSurfaceOrigin origin,
Robert Phillips6c2aa7a2019-10-17 19:06:39 +0000242 VkPipelineDepthStencilStateCreateInfo* stencilInfo) {
Robert Phillipsa87c5292019-11-12 10:12:42 -0500243
Greg Daniel164a9f02016-02-22 09:56:40 -0500244 memset(stencilInfo, 0, sizeof(VkPipelineDepthStencilStateCreateInfo));
245 stencilInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
246 stencilInfo->pNext = nullptr;
247 stencilInfo->flags = 0;
248 // set depth testing defaults
249 stencilInfo->depthTestEnable = VK_FALSE;
250 stencilInfo->depthWriteEnable = VK_FALSE;
251 stencilInfo->depthCompareOp = VK_COMPARE_OP_ALWAYS;
252 stencilInfo->depthBoundsTestEnable = VK_FALSE;
253 stencilInfo->stencilTestEnable = !stencilSettings.isDisabled();
254 if (!stencilSettings.isDisabled()) {
cdalton93a379b2016-05-11 13:58:08 -0700255 if (!stencilSettings.isTwoSided()) {
Chris Dalton67d43fe2019-11-05 23:01:21 -0700256 setup_stencil_op_state(&stencilInfo->front, stencilSettings.singleSidedFace());
cdalton93a379b2016-05-11 13:58:08 -0700257 stencilInfo->back = stencilInfo->front;
258 } else {
Chris Dalton67d43fe2019-11-05 23:01:21 -0700259 setup_stencil_op_state(&stencilInfo->front, stencilSettings.postOriginCCWFace(origin));
260 setup_stencil_op_state(&stencilInfo->back, stencilSettings.postOriginCWFace(origin));
cdalton93a379b2016-05-11 13:58:08 -0700261 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500262 }
263 stencilInfo->minDepthBounds = 0.0f;
264 stencilInfo->maxDepthBounds = 1.0f;
265}
266
egdanielec440992016-09-13 09:54:11 -0700267static void setup_viewport_scissor_state(VkPipelineViewportStateCreateInfo* viewportInfo) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500268 memset(viewportInfo, 0, sizeof(VkPipelineViewportStateCreateInfo));
269 viewportInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
270 viewportInfo->pNext = nullptr;
271 viewportInfo->flags = 0;
272
Greg Daniel164a9f02016-02-22 09:56:40 -0500273 viewportInfo->viewportCount = 1;
egdaniel470d77a2016-03-18 12:50:27 -0700274 viewportInfo->pViewports = nullptr; // This is set dynamically
Greg Daniel164a9f02016-02-22 09:56:40 -0500275
egdaniel470d77a2016-03-18 12:50:27 -0700276 viewportInfo->scissorCount = 1;
277 viewportInfo->pScissors = nullptr; // This is set dynamically
Greg Daniel164a9f02016-02-22 09:56:40 -0500278
Greg Daniel164a9f02016-02-22 09:56:40 -0500279 SkASSERT(viewportInfo->viewportCount == viewportInfo->scissorCount);
280}
281
Chris Dalton57ab06c2021-04-22 12:57:28 -0600282static void setup_multisample_state(int numSamples,
egdanielec440992016-09-13 09:54:11 -0700283 const GrCaps* caps,
284 VkPipelineMultisampleStateCreateInfo* multisampleInfo) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500285 memset(multisampleInfo, 0, sizeof(VkPipelineMultisampleStateCreateInfo));
286 multisampleInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
287 multisampleInfo->pNext = nullptr;
288 multisampleInfo->flags = 0;
Chris Dalton57ab06c2021-04-22 12:57:28 -0600289 SkAssertResult(GrSampleCountToVkSampleCount(numSamples,
Robert Phillips901aff02019-10-08 12:32:56 -0400290 &multisampleInfo->rasterizationSamples));
Brian Osmana63593a2018-12-06 15:54:53 -0500291 multisampleInfo->sampleShadingEnable = VK_FALSE;
292 multisampleInfo->minSampleShading = 0.0f;
Greg Daniel164a9f02016-02-22 09:56:40 -0500293 multisampleInfo->pSampleMask = nullptr;
294 multisampleInfo->alphaToCoverageEnable = VK_FALSE;
295 multisampleInfo->alphaToOneEnable = VK_FALSE;
296}
297
298static VkBlendFactor blend_coeff_to_vk_blend(GrBlendCoeff coeff) {
Greg Daniel6e2af5c2020-03-30 15:07:05 -0400299 switch (coeff) {
300 case kZero_GrBlendCoeff:
301 return VK_BLEND_FACTOR_ZERO;
302 case kOne_GrBlendCoeff:
303 return VK_BLEND_FACTOR_ONE;
304 case kSC_GrBlendCoeff:
305 return VK_BLEND_FACTOR_SRC_COLOR;
306 case kISC_GrBlendCoeff:
307 return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
308 case kDC_GrBlendCoeff:
309 return VK_BLEND_FACTOR_DST_COLOR;
310 case kIDC_GrBlendCoeff:
311 return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
312 case kSA_GrBlendCoeff:
313 return VK_BLEND_FACTOR_SRC_ALPHA;
314 case kISA_GrBlendCoeff:
315 return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
316 case kDA_GrBlendCoeff:
317 return VK_BLEND_FACTOR_DST_ALPHA;
318 case kIDA_GrBlendCoeff:
319 return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
320 case kConstC_GrBlendCoeff:
321 return VK_BLEND_FACTOR_CONSTANT_COLOR;
322 case kIConstC_GrBlendCoeff:
323 return VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR;
324 case kS2C_GrBlendCoeff:
325 return VK_BLEND_FACTOR_SRC1_COLOR;
326 case kIS2C_GrBlendCoeff:
327 return VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR;
328 case kS2A_GrBlendCoeff:
329 return VK_BLEND_FACTOR_SRC1_ALPHA;
330 case kIS2A_GrBlendCoeff:
331 return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
332 case kIllegal_GrBlendCoeff:
333 return VK_BLEND_FACTOR_ZERO;
334 }
335 SkUNREACHABLE;
Greg Daniel164a9f02016-02-22 09:56:40 -0500336}
337
Greg Daniel164a9f02016-02-22 09:56:40 -0500338static VkBlendOp blend_equation_to_vk_blend_op(GrBlendEquation equation) {
339 static const VkBlendOp gTable[] = {
Greg Daniel313c6952018-08-08 09:24:08 -0400340 // Basic blend ops
341 VK_BLEND_OP_ADD,
342 VK_BLEND_OP_SUBTRACT,
343 VK_BLEND_OP_REVERSE_SUBTRACT,
344
345 // Advanced blend ops
346 VK_BLEND_OP_SCREEN_EXT,
347 VK_BLEND_OP_OVERLAY_EXT,
348 VK_BLEND_OP_DARKEN_EXT,
349 VK_BLEND_OP_LIGHTEN_EXT,
350 VK_BLEND_OP_COLORDODGE_EXT,
351 VK_BLEND_OP_COLORBURN_EXT,
352 VK_BLEND_OP_HARDLIGHT_EXT,
353 VK_BLEND_OP_SOFTLIGHT_EXT,
354 VK_BLEND_OP_DIFFERENCE_EXT,
355 VK_BLEND_OP_EXCLUSION_EXT,
356 VK_BLEND_OP_MULTIPLY_EXT,
357 VK_BLEND_OP_HSL_HUE_EXT,
358 VK_BLEND_OP_HSL_SATURATION_EXT,
359 VK_BLEND_OP_HSL_COLOR_EXT,
Mike Klein36743362018-11-06 08:23:30 -0500360 VK_BLEND_OP_HSL_LUMINOSITY_EXT,
361
362 // Illegal.
363 VK_BLEND_OP_ADD,
Greg Daniel164a9f02016-02-22 09:56:40 -0500364 };
Brian Salomon4dea72a2019-12-18 10:43:10 -0500365 static_assert(0 == kAdd_GrBlendEquation);
366 static_assert(1 == kSubtract_GrBlendEquation);
367 static_assert(2 == kReverseSubtract_GrBlendEquation);
368 static_assert(3 == kScreen_GrBlendEquation);
369 static_assert(4 == kOverlay_GrBlendEquation);
370 static_assert(5 == kDarken_GrBlendEquation);
371 static_assert(6 == kLighten_GrBlendEquation);
372 static_assert(7 == kColorDodge_GrBlendEquation);
373 static_assert(8 == kColorBurn_GrBlendEquation);
374 static_assert(9 == kHardLight_GrBlendEquation);
375 static_assert(10 == kSoftLight_GrBlendEquation);
376 static_assert(11 == kDifference_GrBlendEquation);
377 static_assert(12 == kExclusion_GrBlendEquation);
378 static_assert(13 == kMultiply_GrBlendEquation);
379 static_assert(14 == kHSLHue_GrBlendEquation);
380 static_assert(15 == kHSLSaturation_GrBlendEquation);
381 static_assert(16 == kHSLColor_GrBlendEquation);
382 static_assert(17 == kHSLLuminosity_GrBlendEquation);
383 static_assert(SK_ARRAY_COUNT(gTable) == kGrBlendEquationCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -0500384
Greg Daniel6e2af5c2020-03-30 15:07:05 -0400385 SkASSERT((unsigned)equation < kGrBlendEquationCnt);
Greg Daniel164a9f02016-02-22 09:56:40 -0500386 return gTable[equation];
387}
388
Greg Danielb39d0762020-12-30 15:02:34 -0500389static void setup_color_blend_state(const GrXferProcessor::BlendInfo& blendInfo,
egdanielec440992016-09-13 09:54:11 -0700390 VkPipelineColorBlendStateCreateInfo* colorBlendInfo,
391 VkPipelineColorBlendAttachmentState* attachmentState) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500392 GrBlendEquation equation = blendInfo.fEquation;
393 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend;
394 GrBlendCoeff dstCoeff = blendInfo.fDstBlend;
Greg Daniel0a335512020-03-31 09:14:57 -0400395 bool blendOff = GrBlendShouldDisable(equation, srcCoeff, dstCoeff);
Greg Daniel164a9f02016-02-22 09:56:40 -0500396
397 memset(attachmentState, 0, sizeof(VkPipelineColorBlendAttachmentState));
398 attachmentState->blendEnable = !blendOff;
399 if (!blendOff) {
400 attachmentState->srcColorBlendFactor = blend_coeff_to_vk_blend(srcCoeff);
401 attachmentState->dstColorBlendFactor = blend_coeff_to_vk_blend(dstCoeff);
402 attachmentState->colorBlendOp = blend_equation_to_vk_blend_op(equation);
403 attachmentState->srcAlphaBlendFactor = blend_coeff_to_vk_blend(srcCoeff);
404 attachmentState->dstAlphaBlendFactor = blend_coeff_to_vk_blend(dstCoeff);
405 attachmentState->alphaBlendOp = blend_equation_to_vk_blend_op(equation);
406 }
egdaniel3d5d9ac2016-03-01 12:56:15 -0800407
408 if (!blendInfo.fWriteColor) {
409 attachmentState->colorWriteMask = 0;
410 } else {
411 attachmentState->colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |
412 VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
413 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500414
415 memset(colorBlendInfo, 0, sizeof(VkPipelineColorBlendStateCreateInfo));
416 colorBlendInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
417 colorBlendInfo->pNext = nullptr;
418 colorBlendInfo->flags = 0;
419 colorBlendInfo->logicOpEnable = VK_FALSE;
420 colorBlendInfo->attachmentCount = 1;
421 colorBlendInfo->pAttachments = attachmentState;
egdaniel470d77a2016-03-18 12:50:27 -0700422 // colorBlendInfo->blendConstants is set dynamically
Greg Daniel164a9f02016-02-22 09:56:40 -0500423}
424
Greg Danielb39d0762020-12-30 15:02:34 -0500425static void setup_raster_state(bool isWireframe,
Jim Van Verthfbdc0802017-05-02 16:15:53 -0400426 const GrCaps* caps,
egdanielec440992016-09-13 09:54:11 -0700427 VkPipelineRasterizationStateCreateInfo* rasterInfo) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500428 memset(rasterInfo, 0, sizeof(VkPipelineRasterizationStateCreateInfo));
429 rasterInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
430 rasterInfo->pNext = nullptr;
431 rasterInfo->flags = 0;
432 rasterInfo->depthClampEnable = VK_FALSE;
433 rasterInfo->rasterizerDiscardEnable = VK_FALSE;
Greg Danielb39d0762020-12-30 15:02:34 -0500434 rasterInfo->polygonMode = (caps->wireframeMode() || isWireframe) ?
Chris Dalton1215cda2019-12-17 21:44:04 -0700435 VK_POLYGON_MODE_LINE : VK_POLYGON_MODE_FILL;
Brian Salomonf0861672017-05-08 11:10:10 -0400436 rasterInfo->cullMode = VK_CULL_MODE_NONE;
Chris Daltonb91c4662018-08-01 10:46:22 -0600437 rasterInfo->frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
Greg Daniel164a9f02016-02-22 09:56:40 -0500438 rasterInfo->depthBiasEnable = VK_FALSE;
439 rasterInfo->depthBiasConstantFactor = 0.0f;
440 rasterInfo->depthBiasClamp = 0.0f;
441 rasterInfo->depthBiasSlopeFactor = 0.0f;
442 rasterInfo->lineWidth = 1.0f;
443}
444
Chris Daltonce425af2019-12-16 10:39:03 -0700445static void setup_conservative_raster_info(
446 VkPipelineRasterizationConservativeStateCreateInfoEXT* conservativeRasterInfo) {
447 memset(conservativeRasterInfo, 0,
448 sizeof(VkPipelineRasterizationConservativeStateCreateInfoEXT));
449 conservativeRasterInfo->sType =
450 VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT;
451 conservativeRasterInfo->pNext = nullptr;
452 conservativeRasterInfo->flags = 0;
453 conservativeRasterInfo->conservativeRasterizationMode =
454 VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
455 conservativeRasterInfo->extraPrimitiveOverestimationSize = 0;
456}
457
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000458static void setup_dynamic_state(VkPipelineDynamicStateCreateInfo* dynamicInfo,
Greg Danield1786062020-10-28 15:38:07 +0000459 VkDynamicState* dynamicStates) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500460 memset(dynamicInfo, 0, sizeof(VkPipelineDynamicStateCreateInfo));
461 dynamicInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
egdaniel470d77a2016-03-18 12:50:27 -0700462 dynamicInfo->pNext = VK_NULL_HANDLE;
463 dynamicInfo->flags = 0;
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000464 dynamicStates[0] = VK_DYNAMIC_STATE_VIEWPORT;
465 dynamicStates[1] = VK_DYNAMIC_STATE_SCISSOR;
466 dynamicStates[2] = VK_DYNAMIC_STATE_BLEND_CONSTANTS;
Greg Danield1786062020-10-28 15:38:07 +0000467 dynamicInfo->dynamicStateCount = 3;
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000468 dynamicInfo->pDynamicStates = dynamicStates;
Greg Daniel164a9f02016-02-22 09:56:40 -0500469}
470
Greg Daniel3ef052c2021-01-05 12:20:27 -0500471sk_sp<GrVkPipeline> GrVkPipeline::Make(GrVkGpu* gpu,
Robert Phillips787fd9d2021-03-22 14:48:09 -0400472 const GrGeometryProcessor::AttributeSet& vertexAttribs,
473 const GrGeometryProcessor::AttributeSet& instanceAttribs,
Greg Danielb39d0762020-12-30 15:02:34 -0500474 GrPrimitiveType primitiveType,
475 GrSurfaceOrigin origin,
476 const GrStencilSettings& stencilSettings,
Chris Dalton57ab06c2021-04-22 12:57:28 -0600477 int numSamples,
Greg Danielb39d0762020-12-30 15:02:34 -0500478 bool isHWAntialiasState,
Greg Danielb39d0762020-12-30 15:02:34 -0500479 const GrXferProcessor::BlendInfo& blendInfo,
480 bool isWireframe,
481 bool useConservativeRaster,
Greg Daniela8c32102020-12-30 15:09:32 -0500482 uint32_t subpass,
Greg Danielb39d0762020-12-30 15:02:34 -0500483 VkPipelineShaderStageCreateInfo* shaderStageInfo,
484 int shaderStageCount,
485 VkRenderPass compatibleRenderPass,
486 VkPipelineLayout layout,
Greg Daniela8c32102020-12-30 15:09:32 -0500487 bool ownsLayout,
Greg Danielb39d0762020-12-30 15:02:34 -0500488 VkPipelineCache cache) {
Greg Daniel164a9f02016-02-22 09:56:40 -0500489 VkPipelineVertexInputStateCreateInfo vertexInputInfo;
Chris Dalton1d616352017-05-31 12:51:23 -0600490 SkSTArray<2, VkVertexInputBindingDescription, true> bindingDescs;
egdanielb05df0f2016-06-27 07:15:20 -0700491 SkSTArray<16, VkVertexInputAttributeDescription> attributeDesc;
Greg Danielb39d0762020-12-30 15:02:34 -0500492 int totalAttributeCnt = vertexAttribs.count() + instanceAttribs.count();
Brian Salomon92be2f72018-06-19 14:33:47 -0400493 SkASSERT(totalAttributeCnt <= gpu->vkCaps().maxVertexAttributes());
494 VkVertexInputAttributeDescription* pAttribs = attributeDesc.push_back_n(totalAttributeCnt);
Greg Danielb39d0762020-12-30 15:02:34 -0500495 setup_vertex_input_state(vertexAttribs, instanceAttribs, &vertexInputInfo, &bindingDescs,
496 pAttribs);
Greg Daniel164a9f02016-02-22 09:56:40 -0500497
498 VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo;
Greg Danielb39d0762020-12-30 15:02:34 -0500499 setup_input_assembly_state(primitiveType, &inputAssemblyInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500500
501 VkPipelineDepthStencilStateCreateInfo depthStencilInfo;
Greg Danielb39d0762020-12-30 15:02:34 -0500502 setup_depth_stencil_state(stencilSettings, origin, &depthStencilInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500503
Greg Daniel164a9f02016-02-22 09:56:40 -0500504 VkPipelineViewportStateCreateInfo viewportInfo;
egdanielec440992016-09-13 09:54:11 -0700505 setup_viewport_scissor_state(&viewportInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500506
507 VkPipelineMultisampleStateCreateInfo multisampleInfo;
Chris Dalton57ab06c2021-04-22 12:57:28 -0600508 setup_multisample_state(numSamples, gpu->caps(), &multisampleInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500509
510 // We will only have one color attachment per pipeline.
511 VkPipelineColorBlendAttachmentState attachmentStates[1];
512 VkPipelineColorBlendStateCreateInfo colorBlendInfo;
Greg Danielb39d0762020-12-30 15:02:34 -0500513 setup_color_blend_state(blendInfo, &colorBlendInfo, attachmentStates);
Greg Daniel164a9f02016-02-22 09:56:40 -0500514
515 VkPipelineRasterizationStateCreateInfo rasterInfo;
Greg Danielb39d0762020-12-30 15:02:34 -0500516 setup_raster_state(isWireframe, gpu->caps(), &rasterInfo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500517
Chris Daltonce425af2019-12-16 10:39:03 -0700518 VkPipelineRasterizationConservativeStateCreateInfoEXT conservativeRasterInfo;
Greg Danielb39d0762020-12-30 15:02:34 -0500519 if (useConservativeRaster) {
Chris Daltonce425af2019-12-16 10:39:03 -0700520 SkASSERT(gpu->caps()->conservativeRasterSupport());
521 setup_conservative_raster_info(&conservativeRasterInfo);
522 conservativeRasterInfo.pNext = rasterInfo.pNext;
523 rasterInfo.pNext = &conservativeRasterInfo;
524 }
525
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000526 VkDynamicState dynamicStates[3];
Greg Daniel164a9f02016-02-22 09:56:40 -0500527 VkPipelineDynamicStateCreateInfo dynamicInfo;
Greg Danield1786062020-10-28 15:38:07 +0000528 setup_dynamic_state(&dynamicInfo, dynamicStates);
Greg Daniel164a9f02016-02-22 09:56:40 -0500529
530 VkGraphicsPipelineCreateInfo pipelineCreateInfo;
531 memset(&pipelineCreateInfo, 0, sizeof(VkGraphicsPipelineCreateInfo));
532 pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
533 pipelineCreateInfo.pNext = nullptr;
534 pipelineCreateInfo.flags = 0;
535 pipelineCreateInfo.stageCount = shaderStageCount;
536 pipelineCreateInfo.pStages = shaderStageInfo;
537 pipelineCreateInfo.pVertexInputState = &vertexInputInfo;
538 pipelineCreateInfo.pInputAssemblyState = &inputAssemblyInfo;
539 pipelineCreateInfo.pTessellationState = nullptr;
540 pipelineCreateInfo.pViewportState = &viewportInfo;
541 pipelineCreateInfo.pRasterizationState = &rasterInfo;
542 pipelineCreateInfo.pMultisampleState = &multisampleInfo;
543 pipelineCreateInfo.pDepthStencilState = &depthStencilInfo;
544 pipelineCreateInfo.pColorBlendState = &colorBlendInfo;
545 pipelineCreateInfo.pDynamicState = &dynamicInfo;
546 pipelineCreateInfo.layout = layout;
Greg Daniel99b88e02018-10-03 15:31:20 -0400547 pipelineCreateInfo.renderPass = compatibleRenderPass;
Greg Daniela8c32102020-12-30 15:09:32 -0500548 pipelineCreateInfo.subpass = subpass;
Greg Daniel164a9f02016-02-22 09:56:40 -0500549 pipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
550 pipelineCreateInfo.basePipelineIndex = -1;
551
552 VkPipeline vkPipeline;
Ben Wagner6c30e742019-02-06 10:46:14 -0500553 VkResult err;
554 {
Brian Osman7a20b5c2021-03-15 16:23:33 -0400555 TRACE_EVENT0("skia.shaders", "CreateGraphicsPipeline");
Ben Wagner6c30e742019-02-06 10:46:14 -0500556#if defined(SK_ENABLE_SCOPED_LSAN_SUPPRESSIONS)
557 // skia:8712
558 __lsan::ScopedDisabler lsanDisabler;
559#endif
Greg Danield034c622019-11-20 09:33:29 -0500560 GR_VK_CALL_RESULT(gpu, err, CreateGraphicsPipelines(gpu->device(), cache, 1,
561 &pipelineCreateInfo, nullptr,
562 &vkPipeline));
Ben Wagner6c30e742019-02-06 10:46:14 -0500563 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500564 if (err) {
Greg Daniel5ba448c2018-02-26 13:30:47 -0500565 SkDebugf("Failed to create pipeline. Error: %d\n", err);
Greg Daniel164a9f02016-02-22 09:56:40 -0500566 return nullptr;
567 }
568
Greg Daniela8c32102020-12-30 15:09:32 -0500569 if (!ownsLayout) {
570 layout = VK_NULL_HANDLE;
571 }
Greg Daniel3ef052c2021-01-05 12:20:27 -0500572 return sk_sp<GrVkPipeline>(new GrVkPipeline(gpu, vkPipeline, layout));
Greg Daniel164a9f02016-02-22 09:56:40 -0500573}
574
Greg Daniel3ef052c2021-01-05 12:20:27 -0500575sk_sp<GrVkPipeline> GrVkPipeline::Make(GrVkGpu* gpu,
Greg Daniel91b37b12021-01-05 15:40:54 -0500576 const GrProgramInfo& programInfo,
577 VkPipelineShaderStageCreateInfo* shaderStageInfo,
578 int shaderStageCount,
579 VkRenderPass compatibleRenderPass,
580 VkPipelineLayout layout,
581 VkPipelineCache cache,
582 uint32_t subpass) {
Robert Phillips787fd9d2021-03-22 14:48:09 -0400583 const GrGeometryProcessor& geomProc = programInfo.geomProc();
Greg Danielb39d0762020-12-30 15:02:34 -0500584 const GrPipeline& pipeline = programInfo.pipeline();
Greg Daniela8c32102020-12-30 15:09:32 -0500585
Greg Daniel3ef052c2021-01-05 12:20:27 -0500586 return Make(gpu,
Robert Phillips787fd9d2021-03-22 14:48:09 -0400587 geomProc.vertexAttributes(),
588 geomProc.instanceAttributes(),
Greg Daniel3ef052c2021-01-05 12:20:27 -0500589 programInfo.primitiveType(),
590 programInfo.origin(),
591 programInfo.nonGLStencilSettings(),
Chris Dalton57ab06c2021-04-22 12:57:28 -0600592 programInfo.numSamples(),
Chris Daltoneb0195e2021-08-18 21:39:02 -0600593 programInfo.numSamples() > 1,
Greg Daniel3ef052c2021-01-05 12:20:27 -0500594 pipeline.getXferProcessor().getBlendInfo(),
595 pipeline.isWireframe(),
596 pipeline.usesConservativeRaster(),
597 subpass,
598 shaderStageInfo,
599 shaderStageCount,
600 compatibleRenderPass,
601 layout,
602 /*ownsLayout=*/true,
603 cache);
Greg Danielb39d0762020-12-30 15:02:34 -0500604}
605
Jim Van Verth5082df12020-03-11 16:14:51 -0400606void GrVkPipeline::freeGPUData() const {
607 GR_VK_CALL(fGpu->vkInterface(), DestroyPipeline(fGpu->device(), fPipeline, nullptr));
Greg Daniela8c32102020-12-30 15:09:32 -0500608 if (fPipelineLayout != VK_NULL_HANDLE) {
609 GR_VK_CALL(fGpu->vkInterface(),
610 DestroyPipelineLayout(fGpu->device(), fPipelineLayout, nullptr));
611 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500612}
613
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000614void GrVkPipeline::SetDynamicScissorRectState(GrVkGpu* gpu,
615 GrVkCommandBuffer* cmdBuffer,
Greg Daniela36cb402021-04-20 12:42:11 -0400616 SkISize colorAttachmentDimensions,
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000617 GrSurfaceOrigin rtOrigin,
Greg Daniel4a0d36d2019-09-30 12:24:36 -0400618 const SkIRect& scissorRect) {
619 SkASSERT(scissorRect.isEmpty() ||
Greg Daniela36cb402021-04-20 12:42:11 -0400620 SkIRect::MakeSize(colorAttachmentDimensions).contains(scissorRect));
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000621
622 VkRect2D scissor;
623 scissor.offset.x = scissorRect.fLeft;
624 scissor.extent.width = scissorRect.width();
625 if (kTopLeft_GrSurfaceOrigin == rtOrigin) {
626 scissor.offset.y = scissorRect.fTop;
627 } else {
628 SkASSERT(kBottomLeft_GrSurfaceOrigin == rtOrigin);
Greg Daniela36cb402021-04-20 12:42:11 -0400629 scissor.offset.y = colorAttachmentDimensions.height() - scissorRect.fBottom;
Jim Van Verth6a40abc2017-11-02 16:56:09 +0000630 }
631 scissor.extent.height = scissorRect.height();
632
633 SkASSERT(scissor.offset.x >= 0);
634 SkASSERT(scissor.offset.y >= 0);
635 cmdBuffer->setScissor(gpu, 0, 1, &scissor);
636}
637
Chris Dalton46983b72017-06-06 12:27:16 -0600638void GrVkPipeline::SetDynamicViewportState(GrVkGpu* gpu,
639 GrVkCommandBuffer* cmdBuffer,
Greg Daniela36cb402021-04-20 12:42:11 -0400640 SkISize colorAttachmentDimensions) {
egdaniel470d77a2016-03-18 12:50:27 -0700641 // We always use one viewport the size of the RT
642 VkViewport viewport;
643 viewport.x = 0.0f;
644 viewport.y = 0.0f;
Greg Daniela36cb402021-04-20 12:42:11 -0400645 viewport.width = SkIntToScalar(colorAttachmentDimensions.width());
646 viewport.height = SkIntToScalar(colorAttachmentDimensions.height());
egdaniel470d77a2016-03-18 12:50:27 -0700647 viewport.minDepth = 0.0f;
648 viewport.maxDepth = 1.0f;
649 cmdBuffer->setViewport(gpu, 0, 1, &viewport);
650}
651
Chris Dalton46983b72017-06-06 12:27:16 -0600652void GrVkPipeline::SetDynamicBlendConstantState(GrVkGpu* gpu,
653 GrVkCommandBuffer* cmdBuffer,
Greg Daniel2c3398d2019-06-19 11:58:01 -0400654 const GrSwizzle& swizzle,
Chris Dalton46983b72017-06-06 12:27:16 -0600655 const GrXferProcessor& xferProcessor) {
Chris Daltonbbb3f642019-07-24 12:25:08 -0400656 const GrXferProcessor::BlendInfo& blendInfo = xferProcessor.getBlendInfo();
egdaniel470d77a2016-03-18 12:50:27 -0700657 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend;
658 GrBlendCoeff dstCoeff = blendInfo.fDstBlend;
659 float floatColors[4];
Greg Daniel6e2af5c2020-03-30 15:07:05 -0400660 if (GrBlendCoeffRefsConstant(srcCoeff) || GrBlendCoeffRefsConstant(dstCoeff)) {
Greg Daniel6c9f1012017-05-11 09:20:59 -0400661 // Swizzle the blend to match what the shader will output.
Brian Osman422f95b2018-11-05 16:49:04 -0500662 SkPMColor4f blendConst = swizzle.applyTo(blendInfo.fBlendConstant);
663 floatColors[0] = blendConst.fR;
664 floatColors[1] = blendConst.fG;
665 floatColors[2] = blendConst.fB;
666 floatColors[3] = blendConst.fA;
Greg Daniel95cf99b2020-09-17 11:56:24 -0400667 cmdBuffer->setBlendConstants(gpu, floatColors);
egdaniel470d77a2016-03-18 12:50:27 -0700668 }
egdaniel470d77a2016-03-18 12:50:27 -0700669}