Updated to mozilla format
This commit is contained in:
parent
4019e9c885
commit
443679f7d3
5 changed files with 531 additions and 381 deletions
|
|
@ -9,7 +9,9 @@
|
|||
|
||||
#include "VulkanTools.h"
|
||||
|
||||
const std::string getAssetPath() {
|
||||
const std::string
|
||||
getAssetPath()
|
||||
{
|
||||
#if defined(VK_EXAMPLE_DATA_DIR)
|
||||
return VK_EXAMPLE_DATA_DIR;
|
||||
#else
|
||||
|
|
@ -21,10 +23,12 @@ namespace vks {
|
|||
namespace tools {
|
||||
bool errorModeSilent = false;
|
||||
|
||||
std::string errorString(VkResult errorCode) {
|
||||
std::string
|
||||
errorString(VkResult errorCode)
|
||||
{
|
||||
switch (errorCode) {
|
||||
#define STR(r) \
|
||||
case VK_##r: \
|
||||
#define STR(r) \
|
||||
case VK_##r: \
|
||||
return #r
|
||||
STR(NOT_READY);
|
||||
STR(TIMEOUT);
|
||||
|
|
@ -55,10 +59,12 @@ std::string errorString(VkResult errorCode) {
|
|||
}
|
||||
}
|
||||
|
||||
std::string physicalDeviceTypeString(VkPhysicalDeviceType type) {
|
||||
std::string
|
||||
physicalDeviceTypeString(VkPhysicalDeviceType type)
|
||||
{
|
||||
switch (type) {
|
||||
#define STR(r) \
|
||||
case VK_PHYSICAL_DEVICE_TYPE_##r: \
|
||||
#define STR(r) \
|
||||
case VK_PHYSICAL_DEVICE_TYPE_##r: \
|
||||
return #r
|
||||
STR(OTHER);
|
||||
STR(INTEGRATED_GPU);
|
||||
|
|
@ -70,19 +76,21 @@ std::string physicalDeviceTypeString(VkPhysicalDeviceType type) {
|
|||
}
|
||||
}
|
||||
|
||||
VkBool32 getSupportedDepthFormat(VkPhysicalDevice physicalDevice,
|
||||
VkFormat* depthFormat) {
|
||||
VkBool32
|
||||
getSupportedDepthFormat(VkPhysicalDevice physicalDevice, VkFormat* depthFormat)
|
||||
{
|
||||
// Since all depth formats may be optional, we need to find a suitable depth
|
||||
// format to use Start with the highest precision packed format
|
||||
std::vector<VkFormat> depthFormats = {
|
||||
VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT,
|
||||
VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT,
|
||||
VK_FORMAT_D16_UNORM};
|
||||
std::vector<VkFormat> depthFormats = { VK_FORMAT_D32_SFLOAT_S8_UINT,
|
||||
VK_FORMAT_D32_SFLOAT,
|
||||
VK_FORMAT_D24_UNORM_S8_UINT,
|
||||
VK_FORMAT_D16_UNORM_S8_UINT,
|
||||
VK_FORMAT_D16_UNORM };
|
||||
|
||||
for (auto& format : depthFormats) {
|
||||
VkFormatProperties formatProps;
|
||||
vkGetPhysicalDeviceFormatProperties(physicalDevice, format,
|
||||
&formatProps);
|
||||
vkGetPhysicalDeviceFormatProperties(
|
||||
physicalDevice, format, &formatProps);
|
||||
// Format must support depth stencil attachment for optimal tiling
|
||||
if (formatProps.optimalTilingFeatures &
|
||||
VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||
|
|
@ -95,9 +103,11 @@ VkBool32 getSupportedDepthFormat(VkPhysicalDevice physicalDevice,
|
|||
}
|
||||
|
||||
// Returns if a given format support LINEAR filtering
|
||||
VkBool32 formatIsFilterable(VkPhysicalDevice physicalDevice,
|
||||
VkFormat format,
|
||||
VkImageTiling tiling) {
|
||||
VkBool32
|
||||
formatIsFilterable(VkPhysicalDevice physicalDevice,
|
||||
VkFormat format,
|
||||
VkImageTiling tiling)
|
||||
{
|
||||
VkFormatProperties formatProps;
|
||||
vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &formatProps);
|
||||
|
||||
|
|
@ -116,16 +126,18 @@ VkBool32 formatIsFilterable(VkPhysicalDevice physicalDevice,
|
|||
// an image and put it into an active command buffer
|
||||
// See chapter 11.4 "Image Layout" for details
|
||||
|
||||
void setImageLayout(VkCommandBuffer cmdbuffer,
|
||||
VkImage image,
|
||||
VkImageLayout oldImageLayout,
|
||||
VkImageLayout newImageLayout,
|
||||
VkImageSubresourceRange subresourceRange,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask) {
|
||||
void
|
||||
setImageLayout(VkCommandBuffer cmdbuffer,
|
||||
VkImage image,
|
||||
VkImageLayout oldImageLayout,
|
||||
VkImageLayout newImageLayout,
|
||||
VkImageSubresourceRange subresourceRange,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask)
|
||||
{
|
||||
// Create an image barrier object
|
||||
VkImageMemoryBarrier imageMemoryBarrier =
|
||||
vks::initializers::imageMemoryBarrier();
|
||||
vks::initializers::imageMemoryBarrier();
|
||||
imageMemoryBarrier.oldLayout = oldImageLayout;
|
||||
imageMemoryBarrier.newLayout = newImageLayout;
|
||||
imageMemoryBarrier.image = image;
|
||||
|
|
@ -153,7 +165,7 @@ void setImageLayout(VkCommandBuffer cmdbuffer,
|
|||
// Image is a color attachment
|
||||
// Make sure any writes to the color buffer have been finished
|
||||
imageMemoryBarrier.srcAccessMask =
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
break;
|
||||
|
||||
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
|
||||
|
|
@ -161,7 +173,7 @@ void setImageLayout(VkCommandBuffer cmdbuffer,
|
|||
// Make sure any writes to the depth/stencil buffer have been
|
||||
// finished
|
||||
imageMemoryBarrier.srcAccessMask =
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
break;
|
||||
|
||||
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
|
||||
|
|
@ -205,15 +217,15 @@ void setImageLayout(VkCommandBuffer cmdbuffer,
|
|||
// Image will be used as a color attachment
|
||||
// Make sure any writes to the color buffer have been finished
|
||||
imageMemoryBarrier.dstAccessMask =
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
break;
|
||||
|
||||
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
|
||||
// Image layout will be used as a depth/stencil attachment
|
||||
// Make sure any writes to depth/stencil buffer have been finished
|
||||
imageMemoryBarrier.dstAccessMask =
|
||||
imageMemoryBarrier.dstAccessMask |
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
imageMemoryBarrier.dstAccessMask |
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||
break;
|
||||
|
||||
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
|
||||
|
|
@ -221,7 +233,7 @@ void setImageLayout(VkCommandBuffer cmdbuffer,
|
|||
// Make sure any writes to the image have been finished
|
||||
if (imageMemoryBarrier.srcAccessMask == 0) {
|
||||
imageMemoryBarrier.srcAccessMask =
|
||||
VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
|
||||
}
|
||||
imageMemoryBarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
|
||||
break;
|
||||
|
|
@ -231,38 +243,55 @@ void setImageLayout(VkCommandBuffer cmdbuffer,
|
|||
}
|
||||
|
||||
// Put barrier inside setup command buffer
|
||||
vkCmdPipelineBarrier(cmdbuffer, srcStageMask, dstStageMask, 0, 0, nullptr,
|
||||
0, nullptr, 1, &imageMemoryBarrier);
|
||||
vkCmdPipelineBarrier(cmdbuffer,
|
||||
srcStageMask,
|
||||
dstStageMask,
|
||||
0,
|
||||
0,
|
||||
nullptr,
|
||||
0,
|
||||
nullptr,
|
||||
1,
|
||||
&imageMemoryBarrier);
|
||||
}
|
||||
|
||||
// Fixed sub resource on first mip level and layer
|
||||
void setImageLayout(VkCommandBuffer cmdbuffer,
|
||||
VkImage image,
|
||||
VkImageAspectFlags aspectMask,
|
||||
VkImageLayout oldImageLayout,
|
||||
VkImageLayout newImageLayout,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask) {
|
||||
void
|
||||
setImageLayout(VkCommandBuffer cmdbuffer,
|
||||
VkImage image,
|
||||
VkImageAspectFlags aspectMask,
|
||||
VkImageLayout oldImageLayout,
|
||||
VkImageLayout newImageLayout,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask)
|
||||
{
|
||||
VkImageSubresourceRange subresourceRange = {};
|
||||
subresourceRange.aspectMask = aspectMask;
|
||||
subresourceRange.baseMipLevel = 0;
|
||||
subresourceRange.levelCount = 1;
|
||||
subresourceRange.layerCount = 1;
|
||||
setImageLayout(cmdbuffer, image, oldImageLayout, newImageLayout,
|
||||
subresourceRange, srcStageMask, dstStageMask);
|
||||
setImageLayout(cmdbuffer,
|
||||
image,
|
||||
oldImageLayout,
|
||||
newImageLayout,
|
||||
subresourceRange,
|
||||
srcStageMask,
|
||||
dstStageMask);
|
||||
}
|
||||
|
||||
void insertImageMemoryBarrier(VkCommandBuffer cmdbuffer,
|
||||
VkImage image,
|
||||
VkAccessFlags srcAccessMask,
|
||||
VkAccessFlags dstAccessMask,
|
||||
VkImageLayout oldImageLayout,
|
||||
VkImageLayout newImageLayout,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask,
|
||||
VkImageSubresourceRange subresourceRange) {
|
||||
void
|
||||
insertImageMemoryBarrier(VkCommandBuffer cmdbuffer,
|
||||
VkImage image,
|
||||
VkAccessFlags srcAccessMask,
|
||||
VkAccessFlags dstAccessMask,
|
||||
VkImageLayout oldImageLayout,
|
||||
VkImageLayout newImageLayout,
|
||||
VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask,
|
||||
VkImageSubresourceRange subresourceRange)
|
||||
{
|
||||
VkImageMemoryBarrier imageMemoryBarrier =
|
||||
vks::initializers::imageMemoryBarrier();
|
||||
vks::initializers::imageMemoryBarrier();
|
||||
imageMemoryBarrier.srcAccessMask = srcAccessMask;
|
||||
imageMemoryBarrier.dstAccessMask = dstAccessMask;
|
||||
imageMemoryBarrier.oldLayout = oldImageLayout;
|
||||
|
|
@ -270,11 +299,21 @@ void insertImageMemoryBarrier(VkCommandBuffer cmdbuffer,
|
|||
imageMemoryBarrier.image = image;
|
||||
imageMemoryBarrier.subresourceRange = subresourceRange;
|
||||
|
||||
vkCmdPipelineBarrier(cmdbuffer, srcStageMask, dstStageMask, 0, 0, nullptr,
|
||||
0, nullptr, 1, &imageMemoryBarrier);
|
||||
vkCmdPipelineBarrier(cmdbuffer,
|
||||
srcStageMask,
|
||||
dstStageMask,
|
||||
0,
|
||||
0,
|
||||
nullptr,
|
||||
0,
|
||||
nullptr,
|
||||
1,
|
||||
&imageMemoryBarrier);
|
||||
}
|
||||
|
||||
void exitFatal(std::string message, int32_t exitCode) {
|
||||
void
|
||||
exitFatal(std::string message, int32_t exitCode)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
if (!errorModeSilent) {
|
||||
MessageBox(NULL, message.c_str(), NULL, MB_OK | MB_ICONERROR);
|
||||
|
|
@ -283,11 +322,15 @@ void exitFatal(std::string message, int32_t exitCode) {
|
|||
std::cerr << message << "\n";
|
||||
}
|
||||
|
||||
void exitFatal(std::string message, VkResult resultCode) {
|
||||
void
|
||||
exitFatal(std::string message, VkResult resultCode)
|
||||
{
|
||||
exitFatal(message, (int32_t)resultCode);
|
||||
}
|
||||
|
||||
VkShaderModule loadShader(const char* fileName, VkDevice device) {
|
||||
VkShaderModule
|
||||
loadShader(const char* fileName, VkDevice device)
|
||||
{
|
||||
std::ifstream is(fileName, std::ios::binary | std::ios::in | std::ios::ate);
|
||||
|
||||
if (is.is_open()) {
|
||||
|
|
@ -305,8 +348,8 @@ VkShaderModule loadShader(const char* fileName, VkDevice device) {
|
|||
moduleCreateInfo.codeSize = size;
|
||||
moduleCreateInfo.pCode = (uint32_t*)shaderCode;
|
||||
|
||||
VK_CHECK_RESULT(vkCreateShaderModule(device, &moduleCreateInfo, NULL,
|
||||
&shaderModule));
|
||||
VK_CHECK_RESULT(vkCreateShaderModule(
|
||||
device, &moduleCreateInfo, NULL, &shaderModule));
|
||||
|
||||
delete[] shaderCode;
|
||||
|
||||
|
|
@ -318,9 +361,11 @@ VkShaderModule loadShader(const char* fileName, VkDevice device) {
|
|||
}
|
||||
}
|
||||
|
||||
bool fileExists(const std::string& filename) {
|
||||
bool
|
||||
fileExists(const std::string& filename)
|
||||
{
|
||||
std::ifstream f(filename.c_str());
|
||||
return !f.fail();
|
||||
}
|
||||
} // namespace tools
|
||||
} // namespace vks
|
||||
} // namespace tools
|
||||
} // namespace vks
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue