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