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

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

Issue 1813913002: Use dynamic state from vulkan pipelines (Closed) Base URL: https://skia.googlesource.com/skia.git@drawInterface
Patch Set: Created 4 years, 9 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
« src/gpu/vk/GrVkCommandBuffer.cpp ('K') | « src/gpu/vk/GrVkPipeline.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "GrVkPipeline.h" 8 #include "GrVkPipeline.h"
9 9
10 #include "GrGeometryProcessor.h" 10 #include "GrGeometryProcessor.h"
11 #include "GrPipeline.h" 11 #include "GrPipeline.h"
12 12 #include "GrVkCommandBuffer.h"
13 #include "GrVkGpu.h" 13 #include "GrVkGpu.h"
14 #include "GrVkProgramDesc.h" 14 #include "GrVkProgramDesc.h"
15 #include "GrVkRenderTarget.h" 15 #include "GrVkRenderTarget.h"
16 #include "GrVkUtil.h" 16 #include "GrVkUtil.h"
17 17
18 static inline const VkFormat& attrib_type_to_vkformat(GrVertexAttribType type) { 18 static inline const VkFormat& attrib_type_to_vkformat(GrVertexAttribType type) {
19 SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount); 19 SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount);
20 static const VkFormat kFormats[kGrVertexAttribTypeCount] = { 20 static const VkFormat kFormats[kGrVertexAttribTypeCount] = {
21 VK_FORMAT_R32_SFLOAT, // kFloat_GrVertexAttribType 21 VK_FORMAT_R32_SFLOAT, // kFloat_GrVertexAttribType
22 VK_FORMAT_R32G32_SFLOAT, // kVec2f_GrVertexAttribType 22 VK_FORMAT_R32G32_SFLOAT, // kVec2f_GrVertexAttribType
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 stencilInfo->back.writeMask = stencilSettings.writeMask(face); 181 stencilInfo->back.writeMask = stencilSettings.writeMask(face);
182 stencilInfo->back.reference = stencilSettings.funcRef(face); 182 stencilInfo->back.reference = stencilSettings.funcRef(face);
183 } 183 }
184 stencilInfo->minDepthBounds = 0.0f; 184 stencilInfo->minDepthBounds = 0.0f;
185 stencilInfo->maxDepthBounds = 1.0f; 185 stencilInfo->maxDepthBounds = 1.0f;
186 } 186 }
187 187
188 void setup_viewport_scissor_state(const GrVkGpu* gpu, 188 void setup_viewport_scissor_state(const GrVkGpu* gpu,
189 const GrPipeline& pipeline, 189 const GrPipeline& pipeline,
190 const GrVkRenderTarget* vkRT, 190 const GrVkRenderTarget* vkRT,
191 VkPipelineViewportStateCreateInfo* viewportInf o, 191 VkPipelineViewportStateCreateInfo* viewportInf o) {
192 VkViewport* viewport,
193 VkRect2D* scissor) {
194 memset(viewportInfo, 0, sizeof(VkPipelineViewportStateCreateInfo)); 192 memset(viewportInfo, 0, sizeof(VkPipelineViewportStateCreateInfo));
195 viewportInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 193 viewportInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
196 viewportInfo->pNext = nullptr; 194 viewportInfo->pNext = nullptr;
197 viewportInfo->flags = 0; 195 viewportInfo->flags = 0;
198 196
199 viewport->x = 0.0f;
200 viewport->y = 0.0f;
201 viewport->width = SkIntToScalar(vkRT->width());
202 viewport->height = SkIntToScalar(vkRT->height());
203 viewport->minDepth = 0.0f;
204 viewport->maxDepth = 1.0f;
205 viewportInfo->viewportCount = 1; 197 viewportInfo->viewportCount = 1;
206 viewportInfo->pViewports = viewport; 198 viewportInfo->pViewports = nullptr; // This is set dynamically
207 199
208 const GrScissorState& scissorState = pipeline.getScissorState(); 200 viewportInfo->scissorCount = 1;
209 if (scissorState.enabled() && 201 viewportInfo->pScissors = nullptr; // This is set dynamically
210 !scissorState.rect().contains(0, 0, vkRT->width(), vkRT->height())) {
211 // This all assumes the scissorState has previously been clipped to the device space render
212 // target.
213 scissor->offset.x = scissorState.rect().fLeft;
214 scissor->extent.width = scissorState.rect().width();
215 if (kTopLeft_GrSurfaceOrigin == vkRT->origin()) {
216 scissor->offset.y = scissorState.rect().fTop;
217 } else {
218 SkASSERT(kBottomLeft_GrSurfaceOrigin == vkRT->origin());
219 scissor->offset.y = vkRT->height() - scissorState.rect().fBottom;
220 }
221 scissor->extent.height = scissorState.rect().height();
222 202
223 viewportInfo->scissorCount = 1;
224 viewportInfo->pScissors = scissor;
225 SkASSERT(scissor->offset.x >= 0);
226 SkASSERT(scissor->offset.x + scissor->extent.width <= (uint32_t)vkRT->wi dth());
227 SkASSERT(scissor->offset.y >= 0);
228 SkASSERT(scissor->offset.y + scissor->extent.height <= (uint32_t)vkRT->h eight());
229 } else {
230 scissor->extent.width = vkRT->width();
231 scissor->extent.height = vkRT->height();
232 scissor->offset.x = 0;
233 scissor->offset.y = 0;
234 viewportInfo->scissorCount = 1;
235 viewportInfo->pScissors = scissor;
236 }
237 SkASSERT(viewportInfo->viewportCount == viewportInfo->scissorCount); 203 SkASSERT(viewportInfo->viewportCount == viewportInfo->scissorCount);
238 } 204 }
239 205
240 void setup_multisample_state(const GrPipeline& pipeline, 206 void setup_multisample_state(const GrPipeline& pipeline,
241 VkPipelineMultisampleStateCreateInfo* multisampleIn fo) { 207 VkPipelineMultisampleStateCreateInfo* multisampleIn fo) {
242 memset(multisampleInfo, 0, sizeof(VkPipelineMultisampleStateCreateInfo)); 208 memset(multisampleInfo, 0, sizeof(VkPipelineMultisampleStateCreateInfo));
243 multisampleInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE _INFO; 209 multisampleInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE _INFO;
244 multisampleInfo->pNext = nullptr; 210 multisampleInfo->pNext = nullptr;
245 multisampleInfo->flags = 0; 211 multisampleInfo->flags = 0;
246 int numSamples = pipeline.getRenderTarget()->numColorSamples(); 212 int numSamples = pipeline.getRenderTarget()->numColorSamples();
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 false, 305 false,
340 }; 306 };
341 return gCoeffReferencesBlendConst[coeff]; 307 return gCoeffReferencesBlendConst[coeff];
342 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gCoeffReferencesBlendCon st)); 308 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gCoeffReferencesBlendCon st));
343 // Individual enum asserts already made in blend_coeff_to_vk_blend 309 // Individual enum asserts already made in blend_coeff_to_vk_blend
344 } 310 }
345 311
346 void setup_color_blend_state(const GrVkGpu* gpu, 312 void setup_color_blend_state(const GrVkGpu* gpu,
347 const GrPipeline& pipeline, 313 const GrPipeline& pipeline,
348 VkPipelineColorBlendStateCreateInfo* colorBlendInfo , 314 VkPipelineColorBlendStateCreateInfo* colorBlendInfo ,
349 VkPipelineColorBlendAttachmentState* attachmentStat e) { 315 VkPipelineColorBlendAttachmentState* attachmentStat e,
316 bool* usesBlendConstant) {
350 GrXferProcessor::BlendInfo blendInfo; 317 GrXferProcessor::BlendInfo blendInfo;
351 pipeline.getXferProcessor().getBlendInfo(&blendInfo); 318 pipeline.getXferProcessor().getBlendInfo(&blendInfo);
352 319
353 GrBlendEquation equation = blendInfo.fEquation; 320 GrBlendEquation equation = blendInfo.fEquation;
354 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; 321 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend;
355 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; 322 GrBlendCoeff dstCoeff = blendInfo.fDstBlend;
356 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati on == equation) && 323 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati on == equation) &&
357 kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCo eff; 324 kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCo eff;
358 325
359 memset(attachmentState, 0, sizeof(VkPipelineColorBlendAttachmentState)); 326 memset(attachmentState, 0, sizeof(VkPipelineColorBlendAttachmentState));
(...skipping 14 matching lines...) Expand all
374 VK_COLOR_COMPONENT_B_BIT | VK_COLOR_CO MPONENT_A_BIT; 341 VK_COLOR_COMPONENT_B_BIT | VK_COLOR_CO MPONENT_A_BIT;
375 } 342 }
376 343
377 memset(colorBlendInfo, 0, sizeof(VkPipelineColorBlendStateCreateInfo)); 344 memset(colorBlendInfo, 0, sizeof(VkPipelineColorBlendStateCreateInfo));
378 colorBlendInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_ INFO; 345 colorBlendInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_ INFO;
379 colorBlendInfo->pNext = nullptr; 346 colorBlendInfo->pNext = nullptr;
380 colorBlendInfo->flags = 0; 347 colorBlendInfo->flags = 0;
381 colorBlendInfo->logicOpEnable = VK_FALSE; 348 colorBlendInfo->logicOpEnable = VK_FALSE;
382 colorBlendInfo->attachmentCount = 1; 349 colorBlendInfo->attachmentCount = 1;
383 colorBlendInfo->pAttachments = attachmentState; 350 colorBlendInfo->pAttachments = attachmentState;
384 if (blend_coeff_refs_constant(srcCoeff) || blend_coeff_refs_constant(dstCoef f)) { 351 // colorBlendInfo->blendConstants is set dynamically
jvanverth1 2016/03/18 15:02:26 SkASSERT(usesBlendConstant);
egdaniel 2016/03/18 19:29:58 removed
385 GrColorToRGBAFloat(blendInfo.fBlendConstant, colorBlendInfo->blendConsta nts); 352 *usesBlendConstant = blend_coeff_refs_constant(srcCoeff) || blend_coeff_refs _constant(dstCoeff);
386 }
387 } 353 }
388 354
389 VkCullModeFlags draw_face_to_vk_cull_mode(GrPipelineBuilder::DrawFace drawFace) { 355 VkCullModeFlags draw_face_to_vk_cull_mode(GrPipelineBuilder::DrawFace drawFace) {
390 // Assumes that we've set the front face to be ccw 356 // Assumes that we've set the front face to be ccw
391 static const VkCullModeFlags gTable[] = { 357 static const VkCullModeFlags gTable[] = {
392 VK_CULL_MODE_NONE, // kBoth_DrawFace 358 VK_CULL_MODE_NONE, // kBoth_DrawFace
393 VK_CULL_MODE_BACK_BIT, // kCCW_DrawFace, cull back face 359 VK_CULL_MODE_BACK_BIT, // kCCW_DrawFace, cull back face
394 VK_CULL_MODE_FRONT_BIT, // kCW_DrawFace, cull front face 360 VK_CULL_MODE_FRONT_BIT, // kCW_DrawFace, cull front face
395 }; 361 };
396 GR_STATIC_ASSERT(0 == GrPipelineBuilder::kBoth_DrawFace); 362 GR_STATIC_ASSERT(0 == GrPipelineBuilder::kBoth_DrawFace);
(...skipping 18 matching lines...) Expand all
415 rasterInfo->frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; 381 rasterInfo->frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
416 rasterInfo->depthBiasEnable = VK_FALSE; 382 rasterInfo->depthBiasEnable = VK_FALSE;
417 rasterInfo->depthBiasConstantFactor = 0.0f; 383 rasterInfo->depthBiasConstantFactor = 0.0f;
418 rasterInfo->depthBiasClamp = 0.0f; 384 rasterInfo->depthBiasClamp = 0.0f;
419 rasterInfo->depthBiasSlopeFactor = 0.0f; 385 rasterInfo->depthBiasSlopeFactor = 0.0f;
420 rasterInfo->lineWidth = 1.0f; 386 rasterInfo->lineWidth = 1.0f;
421 } 387 }
422 388
423 void setup_dynamic_state(const GrVkGpu* gpu, 389 void setup_dynamic_state(const GrVkGpu* gpu,
424 const GrPipeline& pipeline, 390 const GrPipeline& pipeline,
425 VkPipelineDynamicStateCreateInfo* dynamicInfo) { 391 bool usingBlendConstant,
392 VkPipelineDynamicStateCreateInfo* dynamicInfo,
393 VkDynamicState* dynamicStates) {
426 memset(dynamicInfo, 0, sizeof(VkPipelineDynamicStateCreateInfo)); 394 memset(dynamicInfo, 0, sizeof(VkPipelineDynamicStateCreateInfo));
427 dynamicInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; 395 dynamicInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
428 // TODO: mask out any state we might want to set dynamically 396 dynamicInfo->pNext = VK_NULL_HANDLE;
429 dynamicInfo->dynamicStateCount = 0; 397 dynamicInfo->flags = 0;
398 dynamicStates[0] = VK_DYNAMIC_STATE_VIEWPORT;
399 dynamicStates[1] = VK_DYNAMIC_STATE_SCISSOR;
400 dynamicStates[2] = VK_DYNAMIC_STATE_BLEND_CONSTANTS;
401 // If we aren't using the blend constant we don't set it on the command buff er where is an error
jvanverth1 2016/03/18 15:02:26 This comment is a little confusing. Suggestion: "I
egdaniel 2016/03/18 19:29:58 always using dynamic blendConstant now
402 // if you say you are using it here.
403 dynamicInfo->dynamicStateCount = usingBlendConstant ? 3 : 2;
404 dynamicInfo->pDynamicStates = dynamicStates;
430 } 405 }
431 406
432 GrVkPipeline* GrVkPipeline::Create(GrVkGpu* gpu, const GrPipeline& pipeline, 407 GrVkPipeline* GrVkPipeline::Create(GrVkGpu* gpu, const GrPipeline& pipeline,
433 const GrPrimitiveProcessor& primProc, 408 const GrPrimitiveProcessor& primProc,
434 VkPipelineShaderStageCreateInfo* shaderStageI nfo, 409 VkPipelineShaderStageCreateInfo* shaderStageI nfo,
435 int shaderStageCount, 410 int shaderStageCount,
436 GrPrimitiveType primitiveType, 411 GrPrimitiveType primitiveType,
437 const GrVkRenderPass& renderPass, 412 const GrVkRenderPass& renderPass,
438 VkPipelineLayout layout, 413 VkPipelineLayout layout,
439 VkPipelineCache cache) { 414 VkPipelineCache cache) {
440 VkPipelineVertexInputStateCreateInfo vertexInputInfo; 415 VkPipelineVertexInputStateCreateInfo vertexInputInfo;
441 VkVertexInputBindingDescription bindingDesc; 416 VkVertexInputBindingDescription bindingDesc;
442 // TODO: allocate this based on VkPhysicalDeviceLimits::maxVertexInputAttrib utes 417 // TODO: allocate this based on VkPhysicalDeviceLimits::maxVertexInputAttrib utes
443 static const int kMaxVertexAttributes = 16; 418 static const int kMaxVertexAttributes = 16;
444 static VkVertexInputAttributeDescription attributeDesc[kMaxVertexAttributes] ; 419 static VkVertexInputAttributeDescription attributeDesc[kMaxVertexAttributes] ;
445 setup_vertex_input_state(primProc, &vertexInputInfo, &bindingDesc, 1, 420 setup_vertex_input_state(primProc, &vertexInputInfo, &bindingDesc, 1,
446 attributeDesc, kMaxVertexAttributes); 421 attributeDesc, kMaxVertexAttributes);
447 422
448 VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo; 423 VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo;
449 setup_input_assembly_state(primitiveType, &inputAssemblyInfo); 424 setup_input_assembly_state(primitiveType, &inputAssemblyInfo);
450 425
451 VkPipelineDepthStencilStateCreateInfo depthStencilInfo; 426 VkPipelineDepthStencilStateCreateInfo depthStencilInfo;
452 setup_depth_stencil_state(gpu, pipeline.getStencil(), &depthStencilInfo); 427 setup_depth_stencil_state(gpu, pipeline.getStencil(), &depthStencilInfo);
453 428
454 GrRenderTarget* rt = pipeline.getRenderTarget(); 429 GrRenderTarget* rt = pipeline.getRenderTarget();
455 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt); 430 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt);
456 VkPipelineViewportStateCreateInfo viewportInfo; 431 VkPipelineViewportStateCreateInfo viewportInfo;
457 VkViewport viewport; 432 setup_viewport_scissor_state(gpu, pipeline, vkRT, &viewportInfo);
458 VkRect2D scissor;
459 setup_viewport_scissor_state(gpu, pipeline, vkRT, &viewportInfo, &viewport, &scissor);
460 433
461 VkPipelineMultisampleStateCreateInfo multisampleInfo; 434 VkPipelineMultisampleStateCreateInfo multisampleInfo;
462 setup_multisample_state(pipeline, &multisampleInfo); 435 setup_multisample_state(pipeline, &multisampleInfo);
463 436
464 // We will only have one color attachment per pipeline. 437 // We will only have one color attachment per pipeline.
465 VkPipelineColorBlendAttachmentState attachmentStates[1]; 438 VkPipelineColorBlendAttachmentState attachmentStates[1];
466 VkPipelineColorBlendStateCreateInfo colorBlendInfo; 439 VkPipelineColorBlendStateCreateInfo colorBlendInfo;
467 setup_color_blend_state(gpu, pipeline, &colorBlendInfo, attachmentStates); 440 bool usesBlendConstant;
441 setup_color_blend_state(gpu, pipeline, &colorBlendInfo, attachmentStates, &u sesBlendConstant);
468 442
469 VkPipelineRasterizationStateCreateInfo rasterInfo; 443 VkPipelineRasterizationStateCreateInfo rasterInfo;
470 setup_raster_state(gpu, pipeline, &rasterInfo); 444 setup_raster_state(gpu, pipeline, &rasterInfo);
471 445
446 VkDynamicState dynamicStates[3];
472 VkPipelineDynamicStateCreateInfo dynamicInfo; 447 VkPipelineDynamicStateCreateInfo dynamicInfo;
473 setup_dynamic_state(gpu, pipeline, &dynamicInfo); 448 setup_dynamic_state(gpu, pipeline, usesBlendConstant, &dynamicInfo, dynamicS tates);
474 449
475 VkGraphicsPipelineCreateInfo pipelineCreateInfo; 450 VkGraphicsPipelineCreateInfo pipelineCreateInfo;
476 memset(&pipelineCreateInfo, 0, sizeof(VkGraphicsPipelineCreateInfo)); 451 memset(&pipelineCreateInfo, 0, sizeof(VkGraphicsPipelineCreateInfo));
477 pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 452 pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
478 pipelineCreateInfo.pNext = nullptr; 453 pipelineCreateInfo.pNext = nullptr;
479 pipelineCreateInfo.flags = 0; 454 pipelineCreateInfo.flags = 0;
480 pipelineCreateInfo.stageCount = shaderStageCount; 455 pipelineCreateInfo.stageCount = shaderStageCount;
481 pipelineCreateInfo.pStages = shaderStageInfo; 456 pipelineCreateInfo.pStages = shaderStageInfo;
482 pipelineCreateInfo.pVertexInputState = &vertexInputInfo; 457 pipelineCreateInfo.pVertexInputState = &vertexInputInfo;
483 pipelineCreateInfo.pInputAssemblyState = &inputAssemblyInfo; 458 pipelineCreateInfo.pInputAssemblyState = &inputAssemblyInfo;
(...skipping 20 matching lines...) Expand all
504 } 479 }
505 480
506 return new GrVkPipeline(vkPipeline); 481 return new GrVkPipeline(vkPipeline);
507 } 482 }
508 483
509 void GrVkPipeline::freeGPUData(const GrVkGpu* gpu) const { 484 void GrVkPipeline::freeGPUData(const GrVkGpu* gpu) const {
510 GR_VK_CALL(gpu->vkInterface(), DestroyPipeline(gpu->device(), fPipeline, nul lptr)); 485 GR_VK_CALL(gpu->vkInterface(), DestroyPipeline(gpu->device(), fPipeline, nul lptr));
511 } 486 }
512 487
513 488
489 void set_dynamic_scissor_state(GrVkGpu* gpu,
490 GrVkCommandBuffer* cmdBuffer,
491 const GrPipeline& pipeline,
492 const GrRenderTarget& target) {
493 // We always use one scissor and if it is disabled we just make it the size of the RT
494 const GrScissorState& scissorState = pipeline.getScissorState();
495 VkRect2D scissor;
496 if (scissorState.enabled() &&
497 !scissorState.rect().contains(0, 0, target.width(), target.height())) {
498 // This all assumes the scissorState has previously been clipped to the device space render
499 // target.
500 scissor.offset.x = scissorState.rect().fLeft;
501 scissor.extent.width = scissorState.rect().width();
502 if (kTopLeft_GrSurfaceOrigin == target.origin()) {
503 scissor.offset.y = scissorState.rect().fTop;
504 } else {
505 SkASSERT(kBottomLeft_GrSurfaceOrigin == target.origin());
506 scissor.offset.y = target.height() - scissorState.rect().fBottom;
507 }
508 scissor.extent.height = scissorState.rect().height();
509
510 SkASSERT(scissor.offset.x >= 0);
511 SkASSERT(scissor.offset.x + scissor.extent.width <= (uint32_t)target.wid th());
512 SkASSERT(scissor.offset.y >= 0);
513 SkASSERT(scissor.offset.y + scissor.extent.height <= (uint32_t)target.he ight());
514 } else {
515 scissor.extent.width = target.width();
516 scissor.extent.height = target.height();
517 scissor.offset.x = 0;
518 scissor.offset.y = 0;
519 }
520 cmdBuffer->setScissor(gpu, 0, 1, &scissor);
521 }
522
523 void set_dynamic_viewport_state(GrVkGpu* gpu,
524 GrVkCommandBuffer* cmdBuffer,
525 const GrRenderTarget& target) {
526 // We always use one viewport the size of the RT
527 VkViewport viewport;
528 viewport.x = 0.0f;
529 viewport.y = 0.0f;
530 viewport.width = SkIntToScalar(target.width());
531 viewport.height = SkIntToScalar(target.height());
532 viewport.minDepth = 0.0f;
533 viewport.maxDepth = 1.0f;
534 cmdBuffer->setViewport(gpu, 0, 1, &viewport);
535 }
536
537 void set_dynamic_blend_constant_state(GrVkGpu* gpu,
538 GrVkCommandBuffer* cmdBuffer,
539 const GrPipeline& pipeline) {
540 GrXferProcessor::BlendInfo blendInfo;
541 pipeline.getXferProcessor().getBlendInfo(&blendInfo);
542 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend;
543 GrBlendCoeff dstCoeff = blendInfo.fDstBlend;
544 if (blend_coeff_refs_constant(srcCoeff) || blend_coeff_refs_constant(dstCoef f)) {
545 float floatColors[4];
546 GrColorToRGBAFloat(blendInfo.fBlendConstant, floatColors);
547 cmdBuffer->setBlendConstants(gpu, floatColors);
548 }
549 }
550
551
552
553 void GrVkPipeline::SetDynamicState(GrVkGpu* gpu,
554 GrVkCommandBuffer* cmdBuffer,
555 const GrPipeline& pipeline) {
556 const GrRenderTarget& target = *pipeline.getRenderTarget();
557 set_dynamic_scissor_state(gpu, cmdBuffer, pipeline, target);
jvanverth1 2016/03/18 15:02:26 This is fine for now, but when you add the change
egdaniel 2016/03/18 19:29:58 added caching
558 set_dynamic_viewport_state(gpu, cmdBuffer, target);
559 set_dynamic_blend_constant_state(gpu, cmdBuffer, pipeline);
560 }
OLDNEW
« src/gpu/vk/GrVkCommandBuffer.cpp ('K') | « src/gpu/vk/GrVkPipeline.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698