• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
8 #include "GrVkCopyPipeline.h"
9 
10 #include "GrVkGpu.h"
11 #include "GrVkUtil.h"
12 #include "SkOnce.h"
13 
14 #if defined(SK_ENABLE_SCOPED_LSAN_SUPPRESSIONS)
15 #include <sanitizer/lsan_interface.h>
16 #endif
17 
setup_multisample_state(int numSamples,VkPipelineMultisampleStateCreateInfo * multisampleInfo)18 static void setup_multisample_state(int numSamples,
19                                     VkPipelineMultisampleStateCreateInfo* multisampleInfo) {
20     memset(multisampleInfo, 0, sizeof(VkPipelineMultisampleStateCreateInfo));
21     multisampleInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
22     multisampleInfo->pNext = nullptr;
23     multisampleInfo->flags = 0;
24     SkAssertResult(GrSampleCountToVkSampleCount(numSamples,
25                                                 &multisampleInfo->rasterizationSamples));
26     multisampleInfo->sampleShadingEnable = VK_FALSE;
27     multisampleInfo->minSampleShading = 0.0f;
28     multisampleInfo->pSampleMask = nullptr;
29     multisampleInfo->alphaToCoverageEnable = VK_FALSE;
30     multisampleInfo->alphaToOneEnable = VK_FALSE;
31 }
32 
Create(GrVkGpu * gpu,VkPipelineShaderStageCreateInfo * shaderStageInfo,VkPipelineLayout pipelineLayout,int numSamples,const GrVkRenderPass & renderPass,VkPipelineCache cache)33 GrVkCopyPipeline* GrVkCopyPipeline::Create(GrVkGpu* gpu,
34                                            VkPipelineShaderStageCreateInfo* shaderStageInfo,
35                                            VkPipelineLayout pipelineLayout,
36                                            int numSamples,
37                                            const GrVkRenderPass& renderPass,
38                                            VkPipelineCache cache) {
39 
40     static const VkVertexInputAttributeDescription attributeDesc = {
41         0,                        // location
42         0,                        // binding
43         VK_FORMAT_R32G32_SFLOAT,  // format
44         0,                        // offset
45     };
46 
47     static const VkVertexInputBindingDescription bindingDesc = {
48         0,                           // binding
49         2 * sizeof(float),           // stride
50         VK_VERTEX_INPUT_RATE_VERTEX  // inputRate
51     };
52 
53     static const VkPipelineVertexInputStateCreateInfo vertexInputInfo = {
54         VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,  // sType
55         nullptr,                                                    // pNext
56         0,                                                          // flags
57         1,                                                          // vertexBindingDescriptionCount
58         &bindingDesc,                                               // pVertexBindingDescriptions
59         1,                                                          // vertexAttributeDescriptionCnt
60         &attributeDesc,                                             // pVertexAttributeDescriptions
61     };
62 
63     static const VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo = {
64         VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,  // sType
65         nullptr,                                                      // pNext
66         0,                                                            // flags
67         VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,                         // topology
68         VK_FALSE                                                      // primitiveRestartEnable
69     };
70 
71     static const VkStencilOpState dummyStencilState = {
72         VK_STENCIL_OP_KEEP,   // failOp
73         VK_STENCIL_OP_KEEP,   // passOp
74         VK_STENCIL_OP_KEEP,   // depthFailOp
75         VK_COMPARE_OP_NEVER,  // compareOp
76         0,                    // compareMask
77         0,                    // writeMask
78         0                     // reference
79     };
80 
81     static const VkPipelineDepthStencilStateCreateInfo stencilInfo = {
82         VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,  // sType
83         nullptr,                                                     // pNext
84         0,                                                           // flags
85         VK_FALSE,                                                    // depthTestEnable
86         VK_FALSE,                                                    // depthWriteEnable
87         VK_COMPARE_OP_ALWAYS,                                        // depthCompareOp
88         VK_FALSE,                                                    // depthBoundsTestEnable
89         VK_FALSE,                                                    // stencilTestEnable
90         dummyStencilState,                                           // front
91         dummyStencilState,                                           // bakc
92         0.0f,                                                        // minDepthBounds
93         1.0f                                                         // maxDepthBounds
94     };
95 
96     static const VkPipelineViewportStateCreateInfo viewportInfo = {
97         VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,  // sType
98         nullptr,                                                // pNext
99         0,                                                      // flags
100         1,                                                      // viewportCount
101         nullptr,                                                // pViewports
102         1,                                                      // scissorCount
103         nullptr                                                 // pScissors
104     };
105 
106     static const VkPipelineColorBlendAttachmentState attachmentState = {
107         VK_FALSE,                                             // blendEnable
108         VK_BLEND_FACTOR_ONE,                                  // srcColorBlendFactor
109         VK_BLEND_FACTOR_ZERO,                                 // dstColorBlendFactor
110         VK_BLEND_OP_ADD,                                      // colorBlendOp
111         VK_BLEND_FACTOR_ONE,                                  // srcAlphaBlendFactor
112         VK_BLEND_FACTOR_ZERO,                                 // dstAlphaBlendFactor
113         VK_BLEND_OP_ADD,                                      // alphaBlendOp
114         VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | // colorWriteMask
115         VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT   // colorWriteMask
116     };
117 
118     static const VkPipelineColorBlendStateCreateInfo colorBlendInfo = {
119         VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,  // sType
120         nullptr,                                                   // pNext
121         0,                                                         // flags
122         VK_FALSE,                                                  // logicOpEnable
123         VK_LOGIC_OP_CLEAR,                                         // logicOp
124         1,                                                         // attachmentCount
125         &attachmentState,                                          // pAttachments
126         { 0.f, 0.f, 0.f, 0.f }                                       // blendConstants[4]
127     };
128 
129     static const VkPipelineRasterizationStateCreateInfo rasterInfo = {
130         VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,  // sType
131         nullptr,                                                     // pNext
132         0,                                                           // flags
133         VK_FALSE,                                                    // depthClampEnable
134         VK_FALSE,                                                    // rasterizerDiscardEnabled
135         VK_POLYGON_MODE_FILL,                                        // polygonMode
136         VK_CULL_MODE_NONE,                                           // cullMode
137         VK_FRONT_FACE_COUNTER_CLOCKWISE,                             // frontFace
138         VK_FALSE,                                                    // depthBiasEnable
139         0.0f,                                                        // depthBiasConstantFactor
140         0.0f,                                                        // depthBiasClamp
141         0.0f,                                                        // depthBiasSlopeFactor
142         1.0f                                                         // lineWidth
143     };
144 
145     static const VkDynamicState dynamicStates[2] = { VK_DYNAMIC_STATE_VIEWPORT,
146         VK_DYNAMIC_STATE_SCISSOR };
147     static const VkPipelineDynamicStateCreateInfo dynamicInfo = {
148         VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,  // sType
149         nullptr,                                               // pNext
150         0,                                                     // flags
151         2,                                                     // dynamicStateCount
152         dynamicStates                                          // pDynamicStates
153     };
154 
155     VkPipelineMultisampleStateCreateInfo multisampleInfo;
156     setup_multisample_state(numSamples, &multisampleInfo);
157 
158     VkGraphicsPipelineCreateInfo pipelineCreateInfo;
159     memset(&pipelineCreateInfo, 0, sizeof(VkGraphicsPipelineCreateInfo));
160     pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
161     pipelineCreateInfo.pNext = nullptr;
162     pipelineCreateInfo.flags = 0;
163     pipelineCreateInfo.stageCount = 2;
164     pipelineCreateInfo.pStages = shaderStageInfo;
165     pipelineCreateInfo.pVertexInputState = &vertexInputInfo;
166     pipelineCreateInfo.pInputAssemblyState = &inputAssemblyInfo;
167     pipelineCreateInfo.pTessellationState = nullptr;
168     pipelineCreateInfo.pViewportState = &viewportInfo;
169     pipelineCreateInfo.pRasterizationState = &rasterInfo;
170     pipelineCreateInfo.pMultisampleState = &multisampleInfo;
171     pipelineCreateInfo.pDepthStencilState = &stencilInfo;
172     pipelineCreateInfo.pColorBlendState = &colorBlendInfo;
173     pipelineCreateInfo.pDynamicState = &dynamicInfo;
174     pipelineCreateInfo.layout = pipelineLayout;
175     pipelineCreateInfo.renderPass = renderPass.vkRenderPass();
176     pipelineCreateInfo.subpass = 0;
177     pipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
178     pipelineCreateInfo.basePipelineIndex = -1;
179 
180     VkPipeline vkPipeline;
181     VkResult err;
182     {
183 #if defined(SK_ENABLE_SCOPED_LSAN_SUPPRESSIONS)
184         // skia:8712
185         __lsan::ScopedDisabler lsanDisabler;
186 #endif
187         err = GR_VK_CALL(gpu->vkInterface(), CreateGraphicsPipelines(gpu->device(),
188                                                                      cache, 1,
189                                                                      &pipelineCreateInfo,
190                                                                      nullptr, &vkPipeline));
191     }
192     if (err) {
193         SkDebugf("Failed to create copy pipeline. Error: %d\n", err);
194         return nullptr;
195     }
196 
197     return new GrVkCopyPipeline(vkPipeline, &renderPass);
198 }
199 
isCompatible(const GrVkRenderPass & rp) const200 bool GrVkCopyPipeline::isCompatible(const GrVkRenderPass& rp) const {
201     return rp.isCompatible(*fRenderPass);
202 }
203