Files
renderdoc/util/test/demos/vk/vk_helpers.cpp
T
2019-02-01 18:32:13 +00:00

211 lines
8.5 KiB
C++

/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2018-2019 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#include <assert.h>
#include <algorithm>
#include "vk_headers.h"
#include "vk_helpers.h"
namespace vkh
{
const char *result_str(VkResult vkr)
{
#define VKR_STR(v) \
case v: return #v;
switch(vkr)
{
VKR_STR(VK_SUCCESS);
VKR_STR(VK_NOT_READY);
VKR_STR(VK_TIMEOUT);
VKR_STR(VK_EVENT_SET);
VKR_STR(VK_EVENT_RESET);
VKR_STR(VK_INCOMPLETE);
VKR_STR(VK_ERROR_OUT_OF_HOST_MEMORY);
VKR_STR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
VKR_STR(VK_ERROR_INITIALIZATION_FAILED);
VKR_STR(VK_ERROR_DEVICE_LOST);
VKR_STR(VK_ERROR_MEMORY_MAP_FAILED);
VKR_STR(VK_ERROR_LAYER_NOT_PRESENT);
VKR_STR(VK_ERROR_EXTENSION_NOT_PRESENT);
VKR_STR(VK_ERROR_FEATURE_NOT_PRESENT);
VKR_STR(VK_ERROR_INCOMPATIBLE_DRIVER);
VKR_STR(VK_ERROR_TOO_MANY_OBJECTS);
VKR_STR(VK_ERROR_FORMAT_NOT_SUPPORTED);
VKR_STR(VK_ERROR_FRAGMENTED_POOL);
VKR_STR(VK_ERROR_SURFACE_LOST_KHR);
VKR_STR(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
VKR_STR(VK_SUBOPTIMAL_KHR);
VKR_STR(VK_ERROR_OUT_OF_DATE_KHR);
VKR_STR(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
VKR_STR(VK_ERROR_VALIDATION_FAILED_EXT);
VKR_STR(VK_ERROR_INVALID_SHADER_NV);
VKR_STR(VK_ERROR_OUT_OF_POOL_MEMORY_KHR);
VKR_STR(VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR);
VKR_STR(VK_ERROR_NOT_PERMITTED_EXT);
VKR_STR(VK_RESULT_MAX_ENUM);
default: break;
}
return "VK_RESULT_????";
}
template <>
VkFormat _FormatFromObj<float>()
{
return VK_FORMAT_R32_SFLOAT;
}
void updateDescriptorSets(VkDevice device, const std::vector<VkWriteDescriptorSet> &writes,
const std::vector<VkCopyDescriptorSet> &copies)
{
vkUpdateDescriptorSets(device, (uint32_t)writes.size(), writes.data(), (uint32_t)copies.size(),
copies.data());
}
void cmdPipelineBarrier(VkCommandBuffer cmd, std::initializer_list<VkImageMemoryBarrier> img,
std::initializer_list<VkBufferMemoryBarrier> buf,
std::initializer_list<VkMemoryBarrier> mem, VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags)
{
vkCmdPipelineBarrier(cmd, srcStageMask, dstStageMask, dependencyFlags, (uint32_t)mem.size(),
&(*mem.begin()), (uint32_t)buf.size(), &(*buf.begin()), (uint32_t)img.size(),
&(*img.begin()));
}
void cmdPipelineBarrier(VkCommandBuffer cmd, const std::vector<VkImageMemoryBarrier> &img,
const std::vector<VkBufferMemoryBarrier> &buf,
const std::vector<VkMemoryBarrier> &mem, VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags)
{
vkCmdPipelineBarrier(cmd, srcStageMask, dstStageMask, dependencyFlags, (uint32_t)mem.size(),
mem.data(), (uint32_t)buf.size(), buf.data(), (uint32_t)img.size(),
img.data());
}
void cmdBindVertexBuffers(VkCommandBuffer cmd, uint32_t firstBinding,
std::initializer_list<VkBuffer> bufs,
std::initializer_list<VkDeviceSize> offsets)
{
vkCmdBindVertexBuffers(cmd, firstBinding, (uint32_t)bufs.size(), &(*bufs.begin()),
&(*offsets.begin()));
}
void cmdBindDescriptorSets(VkCommandBuffer cmd, VkPipelineBindPoint pipelineBindPoint,
VkPipelineLayout layout, uint32_t firstSet,
std::vector<VkDescriptorSet> bufs, std::vector<uint32_t> dynamicOffsets)
{
vkCmdBindDescriptorSets(cmd, pipelineBindPoint, layout, firstSet, (uint32_t)bufs.size(),
bufs.data(), (uint32_t)dynamicOffsets.size(), dynamicOffsets.data());
}
GraphicsPipelineCreateInfo::GraphicsPipelineCreateInfo()
{
sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pNext = NULL;
flags = 0;
layout = VK_NULL_HANDLE;
renderPass = VK_NULL_HANDLE;
subpass = 0;
basePipelineHandle = VK_NULL_HANDLE;
basePipelineIndex = -1;
pVertexInputState = &vertexInputState;
pInputAssemblyState = &inputAssemblyState;
pTessellationState = &tessellationState;
pViewportState = &viewportState;
pRasterizationState = &rasterizationState;
pMultisampleState = &multisampleState;
pDepthStencilState = &depthStencilState;
pColorBlendState = &colorBlendState;
pDynamicState = &dynamicState;
// defaults
// 1 viewport/scissor, dynamic
dynamicState.dynamicStates = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
viewportState.viewportCount = viewportState.scissorCount = 1;
inputAssemblyState = VkPipelineInputAssemblyStateCreateInfo();
inputAssemblyState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
tessellationState = VkPipelineTessellationStateCreateInfo();
tessellationState.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
rasterizationState = VkPipelineRasterizationStateCreateInfo();
rasterizationState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
rasterizationState.depthClampEnable = VK_TRUE;
rasterizationState.polygonMode = VK_POLYGON_MODE_FILL;
rasterizationState.cullMode = VK_CULL_MODE_NONE;
rasterizationState.frontFace = VK_FRONT_FACE_CLOCKWISE;
rasterizationState.lineWidth = 1.0f;
multisampleState = VkPipelineMultisampleStateCreateInfo();
multisampleState.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
multisampleState.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
depthStencilState = VkPipelineDepthStencilStateCreateInfo();
depthStencilState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
colorBlendState.attachments.push_back({
// blendEnable
VK_FALSE,
// color*
VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_OP_ADD,
// alpha*
VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_OP_ADD,
// colorWriteMask
VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT |
VK_COLOR_COMPONENT_A_BIT,
});
}
void GraphicsPipelineCreateInfo::bake()
{
stageCount = (uint32_t)stages.size();
pStages = stages.data();
vertexInputState.pVertexAttributeDescriptions = vertexInputState.vertexAttributeDescriptions.data();
vertexInputState.vertexAttributeDescriptionCount =
(uint32_t)vertexInputState.vertexAttributeDescriptions.size();
vertexInputState.pVertexBindingDescriptions = vertexInputState.vertexBindingDescriptions.data();
vertexInputState.vertexBindingDescriptionCount =
(uint32_t)vertexInputState.vertexBindingDescriptions.size();
viewportState.pViewports = viewportState.viewports.data();
viewportState.viewportCount =
std::max(viewportState.viewportCount, (uint32_t)viewportState.viewports.size());
viewportState.pScissors = viewportState.scissors.data();
viewportState.scissorCount =
std::max(viewportState.scissorCount, (uint32_t)viewportState.scissors.size());
colorBlendState.attachmentCount = (uint32_t)colorBlendState.attachments.size();
colorBlendState.pAttachments = colorBlendState.attachments.data();
dynamicState.pDynamicStates = dynamicState.dynamicStates.data();
dynamicState.dynamicStateCount = (uint32_t)dynamicState.dynamicStates.size();
}
}; // namespace vkh