@@ -419,7 +419,7 @@ static VkPipeline getVkPipeline(
419419 .flags = 0 ,
420420 .depthClampEnable = VK_TRUE ,
421421 .rasterizerDiscardEnable = VK_FALSE ,
422- .polygonMode = grRasterState -> polygonMode ,
422+ .polygonMode = grDevice -> dynamicPolygonModeSupported ? 0 : grRasterState -> polygonMode , // Optional dynamic state
423423 .cullMode = 0 , // Dynamic state
424424 .frontFace = 0 , // Dynamic state
425425 .depthBiasEnable = VK_TRUE ,
@@ -433,10 +433,10 @@ static VkPipeline getVkPipeline(
433433 .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO ,
434434 .pNext = NULL ,
435435 .flags = 0 ,
436- .rasterizationSamples = grMsaaState -> sampleCountFlags ,
436+ .rasterizationSamples = grDevice -> dynamicRasterizationSamplesSupported ? VK_SAMPLE_COUNT_1_BIT : grMsaaState -> sampleCountFlags ,
437437 .sampleShadingEnable = VK_FALSE ,
438438 .minSampleShading = 0.f ,
439- .pSampleMask = & grMsaaState -> sampleMask ,
439+ .pSampleMask = grDevice -> dynamicSampleMaskSupported ? NULL : & grMsaaState -> sampleMask ,
440440 .alphaToCoverageEnable = createInfo -> alphaToCoverageEnable ,
441441 .alphaToOneEnable = VK_FALSE ,
442442 };
@@ -462,15 +462,16 @@ static VkPipeline getVkPipeline(
462462 assert (colorFormatCount < GR_MAX_COLOR_TARGETS );
463463
464464 for (unsigned i = 0 ; i < GR_MAX_COLOR_TARGETS ; i ++ ) {
465- const VkPipelineColorBlendAttachmentState * blendState = & grColorBlendState -> states [i ];
465+ const VkColorBlendEquationEXT * blendState = & grColorBlendState -> equationStates [i ];
466+ VkBool32 blendEnabled = grColorBlendState -> blendEnableStates [i ];
466467 VkColorComponentFlags colorWriteMask = createInfo -> colorWriteMasks [i ];
467468
468469 if (colorWriteMask == ~0u ) {
469470 continue ;
470471 }
471472
472473 attachments [attachmentCount ] = (VkPipelineColorBlendAttachmentState ) {
473- .blendEnable = blendState -> blendEnable ,
474+ .blendEnable = blendEnabled ,
474475 .srcColorBlendFactor = blendState -> srcColorBlendFactor ,
475476 .dstColorBlendFactor = blendState -> dstColorBlendFactor ,
476477 .colorBlendOp = blendState -> colorBlendOp ,
@@ -508,7 +509,7 @@ static VkPipeline getVkPipeline(
508509 .blendConstants = { 0.f }, // Dynamic state
509510 };
510511
511- const VkDynamicState dynamicStates [] = {
512+ VkDynamicState dynamicStates [] = {
512513 VK_DYNAMIC_STATE_DEPTH_BIAS ,
513514 VK_DYNAMIC_STATE_BLEND_CONSTANTS ,
514515 VK_DYNAMIC_STATE_DEPTH_BOUNDS ,
@@ -525,13 +526,29 @@ static VkPipeline getVkPipeline(
525526 VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT ,
526527 VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT ,
527528 VK_DYNAMIC_STATE_STENCIL_OP_EXT ,
529+ 0 , 0 , 0 , 0 , 0
528530 };
529-
531+ unsigned dynamicStateCount = COUNT_OF (dynamicStates ) - 5 ;
532+ if (grDevice -> dynamicBlendEnableSupported ) {
533+ dynamicStates [dynamicStateCount ++ ] = VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT ;
534+ }
535+ if (grDevice -> dynamicBlendEquationSupported ) {
536+ dynamicStates [dynamicStateCount ++ ] = VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT ;
537+ }
538+ if (grDevice -> dynamicSampleMaskSupported ) {
539+ dynamicStates [dynamicStateCount ++ ] = VK_DYNAMIC_STATE_SAMPLE_MASK_EXT ;
540+ }
541+ if (grDevice -> dynamicRasterizationSamplesSupported ) {
542+ dynamicStates [dynamicStateCount ++ ] = VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT ;
543+ }
544+ if (grDevice -> dynamicPolygonModeSupported ) {
545+ dynamicStates [dynamicStateCount ++ ] = VK_DYNAMIC_STATE_POLYGON_MODE_EXT ;
546+ }
530547 const VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo = {
531548 .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO ,
532549 .pNext = NULL ,
533550 .flags = 0 ,
534- .dynamicStateCount = COUNT_OF ( dynamicStates ) ,
551+ .dynamicStateCount = dynamicStateCount ,
535552 .pDynamicStates = dynamicStates ,
536553 };
537554
@@ -587,16 +604,17 @@ VkPipeline grPipelineFindOrCreateVkPipeline(
587604 const VkFormat * colorFormats ,
588605 VkFormat depthStencilFormat )
589606{
607+ GrDevice * grDevice = GET_OBJ_DEVICE (grPipeline );
590608 VkPipeline vkPipeline = VK_NULL_HANDLE ;
591609
592610 AcquireSRWLockShared (& grPipeline -> pipelineSlotsLock );
593611 // Assume that the attachment formats never change to reduce pipeline lookup overhead
594612 for (unsigned i = 0 ; i < grPipeline -> pipelineSlotCount ; i ++ ) {
595613 const PipelineSlot * slot = & grPipeline -> pipelineSlots [i ];
596614
597- if (grColorBlendState == slot -> grColorBlendState &&
598- grMsaaState == slot -> grMsaaState &&
599- grRasterState == slot -> grRasterState ) {
615+ if ((( grDevice -> dynamicBlendEnableSupported && grDevice -> dynamicBlendEquationSupported ) || grColorBlendState == slot -> grColorBlendState ) &&
616+ (( grDevice -> dynamicSampleMaskSupported && grDevice -> dynamicRasterizationSamplesSupported ) || grMsaaState == slot -> grMsaaState ) &&
617+ ( grDevice -> dynamicPolygonModeSupported || grRasterState == slot -> grRasterState ) ) {
600618 vkPipeline = slot -> pipeline ;
601619 break ;
602620 }
@@ -612,9 +630,9 @@ VkPipeline grPipelineFindOrCreateVkPipeline(
612630 for (unsigned i = 0 ; i < grPipeline -> pipelineSlotCount ; i ++ ) {
613631 const PipelineSlot * slot = & grPipeline -> pipelineSlots [i ];
614632
615- if (grColorBlendState == slot -> grColorBlendState &&
616- grMsaaState == slot -> grMsaaState &&
617- grRasterState == slot -> grRasterState ) {
633+ if ((( grDevice -> dynamicBlendEnableSupported && grDevice -> dynamicBlendEquationSupported ) || grColorBlendState == slot -> grColorBlendState ) &&
634+ (( grDevice -> dynamicSampleMaskSupported && grDevice -> dynamicRasterizationSamplesSupported ) || grMsaaState == slot -> grMsaaState ) &&
635+ ( grDevice -> dynamicPolygonModeSupported || grRasterState == slot -> grRasterState ) ) {
618636 vkPipeline = slot -> pipeline ;
619637 break ;
620638 }
0 commit comments