| Index: src/gpu/vk/GrVkCopyPipeline.cpp
|
| diff --git a/src/gpu/vk/GrVkCopyPipeline.cpp b/src/gpu/vk/GrVkCopyPipeline.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a9b9503d3ff961f720117c86adbba6781062affc
|
| --- /dev/null
|
| +++ b/src/gpu/vk/GrVkCopyPipeline.cpp
|
| @@ -0,0 +1,190 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "GrVkCopyPipeline.h"
|
| +
|
| +#include "GrVkGpu.h"
|
| +#include "GrVkUtil.h"
|
| +#include "SkOnce.h"
|
| +
|
| +static void setup_multisample_state(int numSamples,
|
| + VkPipelineMultisampleStateCreateInfo* multisampleInfo) {
|
| + memset(multisampleInfo, 0, sizeof(VkPipelineMultisampleStateCreateInfo));
|
| + multisampleInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
| + multisampleInfo->pNext = nullptr;
|
| + multisampleInfo->flags = 0;
|
| + SkAssertResult(GrSampleCountToVkSampleCount(numSamples,
|
| + &multisampleInfo->rasterizationSamples));
|
| + multisampleInfo->sampleShadingEnable = VK_FALSE;
|
| + multisampleInfo->minSampleShading = 0.0f;
|
| + multisampleInfo->pSampleMask = nullptr;
|
| + multisampleInfo->alphaToCoverageEnable = VK_FALSE;
|
| + multisampleInfo->alphaToOneEnable = VK_FALSE;
|
| +}
|
| +
|
| +GrVkCopyPipeline* GrVkCopyPipeline::Create(GrVkGpu* gpu,
|
| + VkPipelineShaderStageCreateInfo* shaderStageInfo,
|
| + VkPipelineLayout pipelineLayout,
|
| + int numSamples,
|
| + const GrVkRenderPass& renderPass,
|
| + VkPipelineCache cache) {
|
| +
|
| + static const VkVertexInputAttributeDescription attributeDesc = {
|
| + 0, // location
|
| + 0, // binding
|
| + VK_FORMAT_R32G32_SFLOAT, // format
|
| + 0, // offset
|
| + };
|
| +
|
| + static const VkVertexInputBindingDescription bindingDesc = {
|
| + 0, // binding
|
| + 2 * sizeof(float), // stride
|
| + VK_VERTEX_INPUT_RATE_VERTEX // inputRate
|
| + };
|
| +
|
| + static const VkPipelineVertexInputStateCreateInfo vertexInputInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + 1, // vertexBindingDescriptionCount
|
| + &bindingDesc, // pVertexBindingDescriptions
|
| + 1, // vertexAttributeDescriptionCnt
|
| + &attributeDesc, // pVertexAttributeDescriptions
|
| + };
|
| +
|
| + static const VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, // topology
|
| + VK_FALSE // primitiveRestartEnable
|
| + };
|
| +
|
| + static const VkStencilOpState dummyStencilState = {
|
| + VK_STENCIL_OP_KEEP, // failOp
|
| + VK_STENCIL_OP_KEEP, // passOp
|
| + VK_STENCIL_OP_KEEP, // depthFailOp
|
| + VK_COMPARE_OP_NEVER, // compareOp
|
| + 0, // compareMask
|
| + 0, // writeMask
|
| + 0 // reference
|
| + };
|
| +
|
| + static const VkPipelineDepthStencilStateCreateInfo stencilInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + VK_FALSE, // depthTestEnable
|
| + VK_FALSE, // depthWriteEnable
|
| + VK_COMPARE_OP_ALWAYS, // depthCompareOp
|
| + VK_FALSE, // depthBoundsTestEnable
|
| + VK_FALSE, // stencilTestEnable
|
| + dummyStencilState, // front
|
| + dummyStencilState, // bakc
|
| + 0.0f, // minDepthBounds
|
| + 1.0f // maxDepthBounds
|
| + };
|
| +
|
| + static const VkPipelineViewportStateCreateInfo viewportInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + 1, // viewportCount
|
| + nullptr, // pViewports
|
| + 1, // scissorCount
|
| + nullptr // pScissors
|
| + };
|
| +
|
| + static const VkPipelineColorBlendAttachmentState attachmentState = {
|
| + VK_TRUE, // belndEnable
|
| + VK_BLEND_FACTOR_ONE, // srcColorBlendFactor
|
| + VK_BLEND_FACTOR_ZERO, // dstColorBlendFactor
|
| + VK_BLEND_OP_ADD, // colorBlendOp
|
| + VK_BLEND_FACTOR_ONE, // srcAlphaBlendFactor
|
| + VK_BLEND_FACTOR_ZERO, // dstAlphaBlendFactor
|
| + VK_BLEND_OP_ADD, // alphaBlendOp
|
| + VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | // colorWriteMask
|
| + VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT // colorWriteMask
|
| + };
|
| +
|
| + static const VkPipelineColorBlendStateCreateInfo colorBlendInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + VK_FALSE, // logicOpEnable
|
| + VK_LOGIC_OP_CLEAR, // logicOp
|
| + 1, // attachmentCount
|
| + &attachmentState, // pAttachments
|
| + { 0.f, 0.f, 0.f, 0.f } // blendConstants[4]
|
| + };
|
| +
|
| + static const VkPipelineRasterizationStateCreateInfo rasterInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + VK_FALSE, // depthClampEnable
|
| + VK_FALSE, // rasterizerDiscardEnabled
|
| + VK_POLYGON_MODE_FILL, // polygonMode
|
| + VK_CULL_MODE_NONE, // cullMode
|
| + VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace
|
| + VK_FALSE, // depthBiasEnable
|
| + 0.0f, // depthBiasConstantFactor
|
| + 0.0f, // depthBiasClamp
|
| + 0.0f, // depthBiasSlopeFactor
|
| + 1.0f // lineWidth
|
| + };
|
| +
|
| + static const VkDynamicState dynamicStates[2] = { VK_DYNAMIC_STATE_VIEWPORT,
|
| + VK_DYNAMIC_STATE_SCISSOR };
|
| + static const VkPipelineDynamicStateCreateInfo dynamicInfo = {
|
| + VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, // sType
|
| + nullptr, // pNext
|
| + 0, // flags
|
| + 2, // dynamicStateCount
|
| + dynamicStates // pDynamicStates
|
| + };
|
| +
|
| + VkPipelineMultisampleStateCreateInfo multisampleInfo;
|
| + setup_multisample_state(numSamples, &multisampleInfo);
|
| +
|
| + VkGraphicsPipelineCreateInfo pipelineCreateInfo;
|
| + memset(&pipelineCreateInfo, 0, sizeof(VkGraphicsPipelineCreateInfo));
|
| + pipelineCreateInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
| + pipelineCreateInfo.pNext = nullptr;
|
| + pipelineCreateInfo.flags = 0;
|
| + pipelineCreateInfo.stageCount = 2;
|
| + pipelineCreateInfo.pStages = shaderStageInfo;
|
| + pipelineCreateInfo.pVertexInputState = &vertexInputInfo;
|
| + pipelineCreateInfo.pInputAssemblyState = &inputAssemblyInfo;
|
| + pipelineCreateInfo.pTessellationState = nullptr;
|
| + pipelineCreateInfo.pViewportState = &viewportInfo;
|
| + pipelineCreateInfo.pRasterizationState = &rasterInfo;
|
| + pipelineCreateInfo.pMultisampleState = &multisampleInfo;
|
| + pipelineCreateInfo.pDepthStencilState = &stencilInfo;
|
| + pipelineCreateInfo.pColorBlendState = &colorBlendInfo;
|
| + pipelineCreateInfo.pDynamicState = &dynamicInfo;
|
| + pipelineCreateInfo.layout = pipelineLayout;
|
| + pipelineCreateInfo.renderPass = renderPass.vkRenderPass();
|
| + pipelineCreateInfo.subpass = 0;
|
| + pipelineCreateInfo.basePipelineHandle = VK_NULL_HANDLE;
|
| + pipelineCreateInfo.basePipelineIndex = -1;
|
| +
|
| + VkPipeline vkPipeline;
|
| + VkResult err = GR_VK_CALL(gpu->vkInterface(), CreateGraphicsPipelines(gpu->device(),
|
| + cache, 1,
|
| + &pipelineCreateInfo,
|
| + nullptr, &vkPipeline));
|
| + if (err) {
|
| + return nullptr;
|
| + }
|
| +
|
| + return new GrVkCopyPipeline(vkPipeline, &renderPass);
|
| +}
|
| +
|
| +bool GrVkCopyPipeline::isCompatible(const GrVkRenderPass& rp) const {
|
| + return rp.isCompatible(*fRenderPass);
|
| +}
|
|
|