VkPPRenderPassSetup::VkPPRenderPassSetup(const VkPPRenderPassKey &key) { CreateDescriptorLayout(key); CreatePipelineLayout(key); CreateRenderPass(key); CreatePipeline(key); }
bool HookGui::HGWidgetShader::Initialize(VulkanWrapper::Context* _graphicContext) { // Get the model manager VulkanWrapper::ModelManager* modelManager = _graphicContext->GetModelManager(); // Request our widget model object modelManager->RequestObject(&m_WidgetModel, "square"); // Create the instance buffer CreateInstanceBuffer(_graphicContext); // Create the uniform buffer CreateUniformBuffer(_graphicContext); // Create the descriptor set CreateDescriptorSet(_graphicContext); // Create our render pass CreateRenderPass(_graphicContext); // Create the graphic pipeline CreateGraphicsPipeline(_graphicContext); // Create the frame buffers CreateFramebuffers(_graphicContext->GetGraphicInstance(), _graphicContext->GetSwapChain(), m_Framebuffers, m_RenderPass); // Create the command buffer m_CommandBuffer = VWShaderBase::CreateCommandBuffer(_graphicContext, VK_COMMAND_BUFFER_LEVEL_PRIMARY, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); return true; }
bool Tutorial03::ChildOnWindowSizeChanged() { if( !CreateRenderPass() ) { return false; } if( !CreateFramebuffers() ) { return false; } if( !CreatePipeline() ) { return false; } if( !CreateCommandBuffers() ) { return false; } if( !RecordCommandBuffers() ) { return false; } return true; }
bool SwapChain::RecreateSurface(void* native_handle) { // Destroy the old swap chain, images, and surface. DestroyRenderPass(); DestroySwapChainImages(); DestroySwapChain(); DestroySurface(); // Re-create the surface with the new native handle m_native_handle = native_handle; m_surface = CreateVulkanSurface(g_vulkan_context->GetVulkanInstance(), native_handle); if (m_surface == VK_NULL_HANDLE) return false; // Finally re-create the swap chain if (!CreateSwapChain() || !SetupSwapChainImages() || !CreateRenderPass()) return false; return true; }
void GrVkRenderPass::init(const GrVkGpu* gpu, const LoadStoreOps& colorOp, const LoadStoreOps& resolveOp, const LoadStoreOps& stencilOp) { uint32_t numAttachments = fAttachmentsDescriptor.fAttachmentCount; // Attachment descriptions to be set on the render pass SkTArray<VkAttachmentDescription> attachments(numAttachments); attachments.reset(numAttachments); memset(attachments.begin(), 0, numAttachments * sizeof(VkAttachmentDescription)); // Refs to attachments on the render pass (as described by teh VkAttachmentDescription above), // that are used by the subpass. VkAttachmentReference colorRef; VkAttachmentReference resolveRef; VkAttachmentReference stencilRef; uint32_t currentAttachment = 0; // Go through each of the attachment types (color, resolve, stencil) and set the necessary // on the various Vk structs. VkSubpassDescription subpassDesc; memset(&subpassDesc, 0, sizeof(VkSubpassDescription)); subpassDesc.flags = 0; subpassDesc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpassDesc.inputAttachmentCount = 0; subpassDesc.pInputAttachments = nullptr; if (fAttachmentFlags & kColor_AttachmentFlag) { // set up color attachment fAttachmentsDescriptor.fColor.fLoadStoreOps = colorOp; setup_vk_attachment_description(&attachments[currentAttachment], fAttachmentsDescriptor.fColor, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); // setup subpass use of attachment colorRef.attachment = currentAttachment++; colorRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; subpassDesc.colorAttachmentCount = 1; } else { // I don't think there should ever be a time where we don't have a color attachment SkASSERT(false); colorRef.attachment = VK_ATTACHMENT_UNUSED; colorRef.layout = VK_IMAGE_LAYOUT_UNDEFINED; subpassDesc.colorAttachmentCount = 0; } subpassDesc.pColorAttachments = &colorRef; if (fAttachmentFlags & kResolve_AttachmentFlag) { // set up resolve attachment fAttachmentsDescriptor.fResolve.fLoadStoreOps = resolveOp; setup_vk_attachment_description(&attachments[currentAttachment], fAttachmentsDescriptor.fResolve, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); // setup subpass use of attachment resolveRef.attachment = currentAttachment++; // I'm really not sure what the layout should be for the resolve textures. resolveRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; subpassDesc.pResolveAttachments = &resolveRef; } else { subpassDesc.pResolveAttachments = nullptr; } if (fAttachmentFlags & kStencil_AttachmentFlag) { // set up stencil attachment fAttachmentsDescriptor.fStencil.fLoadStoreOps = stencilOp; setup_vk_attachment_description(&attachments[currentAttachment], fAttachmentsDescriptor.fStencil, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); // setup subpass use of attachment stencilRef.attachment = currentAttachment++; stencilRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; } else { stencilRef.attachment = VK_ATTACHMENT_UNUSED; stencilRef.layout = VK_IMAGE_LAYOUT_UNDEFINED; } subpassDesc.pDepthStencilAttachment = &stencilRef; subpassDesc.preserveAttachmentCount = 0; subpassDesc.pPreserveAttachments = nullptr; SkASSERT(numAttachments == currentAttachment); // Create the VkRenderPass compatible with the attachment descriptions above VkRenderPassCreateInfo createInfo; memset(&createInfo, 0, sizeof(VkRenderPassCreateInfo)); createInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; createInfo.pNext = nullptr; createInfo.flags = 0; createInfo.attachmentCount = numAttachments; createInfo.pAttachments = attachments.begin(); createInfo.subpassCount = 1; createInfo.pSubpasses = &subpassDesc; createInfo.dependencyCount = 0; createInfo.pDependencies = nullptr; GR_VK_CALL_ERRCHECK(gpu->vkInterface(), CreateRenderPass(gpu->device(), &createInfo, nullptr, &fRenderPass)); }