Implicit surface rendering via ray tracing
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

123 lines
5.7 KiB

/*
* Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <vulkan/vulkan_core.h>
#include <algorithm>
#include <cmath>
namespace nvvk {
//////////////////////////////////////////////////////////////////////////
/**
# functions in nvvk
- makeImageMemoryBarrier : returns VkImageMemoryBarrier for an image based on provided layouts and access flags.
- mipLevels : return number of mips for 2d/3d extent
- accessFlagsForImageLayout : helps resource transtions
- pipelineStageForLayout : helps resource transitions
- cmdBarrierImageLayout : inserts barrier for image transition
- cmdGenerateMipmaps : basic mipmap creation for images (meant for one-shot operations)
- makeImage2DCreateInfo : aids 2d image creation
- makeImage3DCreateInfo : aids 3d descriptor set updating
- makeImageCubeCreateInfo : aids cube descriptor set updating
- makeImageViewCreateInfo : aids common image view creation, derives info from VkImageCreateInfo
- makeImage2DViewCreateInfo : aids 2d image view creation
*/
VkImageMemoryBarrier makeImageMemoryBarrier(VkImage image,
VkAccessFlags srcAccess,
VkAccessFlags dstAccess,
VkImageLayout oldLayout,
VkImageLayout newLayout,
VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT);
//--------------------------------------------------------------------------------------------------
inline uint32_t mipLevels(VkExtent2D extent)
{
return static_cast<uint32_t>(std::floor(std::log2(std::max(extent.width, extent.height)))) + 1;
}
inline uint32_t mipLevels(VkExtent3D extent)
{
return static_cast<uint32_t>(std::floor(std::log2(std::max(extent.width, extent.height)))) + 1;
}
//--------------------------------------------------------------------------------------------------
// Transition Pipeline Layout tools
VkAccessFlags accessFlagsForImageLayout(VkImageLayout layout);
VkPipelineStageFlags pipelineStageForLayout(VkImageLayout layout);
void cmdBarrierImageLayout(VkCommandBuffer cmdbuffer,
VkImage image,
VkImageLayout oldImageLayout,
VkImageLayout newImageLayout,
const VkImageSubresourceRange& subresourceRange);
void cmdBarrierImageLayout(VkCommandBuffer cmdbuffer, VkImage image, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkImageAspectFlags aspectMask);
inline void cmdBarrierImageLayout(VkCommandBuffer cmdbuffer, VkImage image, VkImageLayout oldImageLayout, VkImageLayout newImageLayout)
{
cmdBarrierImageLayout(cmdbuffer, image, oldImageLayout, newImageLayout, VK_IMAGE_ASPECT_COLOR_BIT);
}
VkImageCreateInfo makeImage3DCreateInfo(const VkExtent3D& size,
VkFormat format = VK_FORMAT_R8G8B8A8_UNORM,
VkImageUsageFlags usage = VK_IMAGE_USAGE_SAMPLED_BIT,
bool mipmaps = false);
VkImageCreateInfo makeImage2DCreateInfo(const VkExtent2D& size,
VkFormat format = VK_FORMAT_R8G8B8A8_UNORM,
VkImageUsageFlags usage = VK_IMAGE_USAGE_SAMPLED_BIT,
bool mipmaps = false);
VkImageCreateInfo makeImageCubeCreateInfo(const VkExtent2D& size,
VkFormat format = VK_FORMAT_R8G8B8A8_UNORM,
VkImageUsageFlags usage = VK_IMAGE_USAGE_SAMPLED_BIT,
bool mipmaps = false);
// derives format and view type from imageInfo, special case for IMAGE_2D to treat as cube
// view enables all mips and layers
VkImageViewCreateInfo makeImageViewCreateInfo(VkImage image, const VkImageCreateInfo& imageInfo, bool isCube = false);
VkImageViewCreateInfo makeImage2DViewCreateInfo(VkImage image,
VkFormat format = VK_FORMAT_R8G8B8A8_UNORM,
VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT,
uint32_t levels = VK_REMAINING_MIP_LEVELS,
const void* pNextImageView = nullptr);
void cmdGenerateMipmaps(VkCommandBuffer cmdBuf,
VkImage image,
VkFormat imageFormat,
const VkExtent2D& size,
uint32_t levelCount,
uint32_t layerCount = 1,
VkImageLayout currentLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
} // namespace nvvk