mirror of https://github.com/snes9xgit/snes9x.git
Vulkan: Add common function files.
This commit is contained in:
parent
79f6e911f3
commit
14910960eb
|
@ -0,0 +1,164 @@
|
||||||
|
/* Based on code from Vulkan-Samples:
|
||||||
|
https://github.com/KhronosGroup/Vulkan-Samples
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright (c) 2018-2024, Arm Limited and Contributors
|
||||||
|
* Copyright (c) 2019-2024, Sascha Willems
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vulkan_hpp_wrapper.hpp"
|
||||||
|
|
||||||
|
namespace Vulkan {
|
||||||
|
|
||||||
|
vk::AccessFlags get_access_flags(vk::ImageLayout layout)
|
||||||
|
{
|
||||||
|
switch (layout) {
|
||||||
|
case vk::ImageLayout::eUndefined:
|
||||||
|
case vk::ImageLayout::ePresentSrcKHR:
|
||||||
|
return vk::AccessFlagBits::eNone;
|
||||||
|
case vk::ImageLayout::ePreinitialized:
|
||||||
|
return vk::AccessFlagBits::eHostWrite;
|
||||||
|
case vk::ImageLayout::eColorAttachmentOptimal:
|
||||||
|
return vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite;
|
||||||
|
case vk::ImageLayout::eDepthAttachmentOptimal:
|
||||||
|
return vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite;
|
||||||
|
case vk::ImageLayout::eFragmentShadingRateAttachmentOptimalKHR:
|
||||||
|
return vk::AccessFlagBits::eFragmentShadingRateAttachmentReadKHR;
|
||||||
|
case vk::ImageLayout::eShaderReadOnlyOptimal:
|
||||||
|
return vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite;
|
||||||
|
case vk::ImageLayout::eTransferSrcOptimal:
|
||||||
|
return vk::AccessFlagBits::eTransferRead;
|
||||||
|
case vk::ImageLayout::eTransferDstOptimal:
|
||||||
|
return vk::AccessFlagBits::eTransferWrite;
|
||||||
|
case vk::ImageLayout::eGeneral:
|
||||||
|
return vk::AccessFlagBits::eNone;
|
||||||
|
default:
|
||||||
|
return vk::AccessFlagBits::eNone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vk::PipelineStageFlags get_pipeline_stage_flags(vk::ImageLayout layout)
|
||||||
|
{
|
||||||
|
switch (layout) {
|
||||||
|
case vk::ImageLayout::eUndefined:
|
||||||
|
return vk::PipelineStageFlagBits::eTopOfPipe;
|
||||||
|
case vk::ImageLayout::ePreinitialized:
|
||||||
|
return vk::PipelineStageFlagBits::eHost;
|
||||||
|
case vk::ImageLayout::eTransferDstOptimal:
|
||||||
|
case vk::ImageLayout::eTransferSrcOptimal:
|
||||||
|
return vk::PipelineStageFlagBits::eTransfer;
|
||||||
|
case vk::ImageLayout::eColorAttachmentOptimal:
|
||||||
|
return vk::PipelineStageFlagBits::eColorAttachmentOutput;
|
||||||
|
case vk::ImageLayout::eDepthAttachmentOptimal:
|
||||||
|
return vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests;
|
||||||
|
case vk::ImageLayout::eFragmentShadingRateAttachmentOptimalKHR:
|
||||||
|
return vk::PipelineStageFlagBits::eFragmentShadingRateAttachmentKHR;
|
||||||
|
case vk::ImageLayout::eShaderReadOnlyOptimal:
|
||||||
|
return vk::PipelineStageFlagBits::eVertexShader | vk::PipelineStageFlagBits::eFragmentShader;
|
||||||
|
case vk::ImageLayout::ePresentSrcKHR:
|
||||||
|
return vk::PipelineStageFlagBits::eBottomOfPipe;
|
||||||
|
case vk::ImageLayout::eGeneral:
|
||||||
|
return vk::PipelineStageFlagBits::eNone;
|
||||||
|
default:
|
||||||
|
return vk::PipelineStageFlagBits::eNone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
vk::Image image,
|
||||||
|
vk::PipelineStageFlags src_stage_mask,
|
||||||
|
vk::PipelineStageFlags dst_stage_mask,
|
||||||
|
vk::AccessFlags src_access_mask,
|
||||||
|
vk::AccessFlags dst_access_mask,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout,
|
||||||
|
vk::ImageSubresourceRange const &subresource_range)
|
||||||
|
{
|
||||||
|
auto image_memory_barrier = vk::ImageMemoryBarrier{}
|
||||||
|
.setSrcAccessMask(src_access_mask)
|
||||||
|
.setDstAccessMask(dst_access_mask)
|
||||||
|
.setOldLayout(old_layout)
|
||||||
|
.setNewLayout(new_layout)
|
||||||
|
.setImage(image)
|
||||||
|
.setSubresourceRange(subresource_range);
|
||||||
|
|
||||||
|
command_buffer.pipelineBarrier(src_stage_mask,
|
||||||
|
dst_stage_mask,
|
||||||
|
{}, {}, {}, image_memory_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
vk::Image image,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout,
|
||||||
|
vk::ImageSubresourceRange const &subresource_range)
|
||||||
|
{
|
||||||
|
vk::PipelineStageFlags src_stage_mask = get_pipeline_stage_flags(old_layout);
|
||||||
|
vk::PipelineStageFlags dst_stage_mask = get_pipeline_stage_flags(new_layout);
|
||||||
|
vk::AccessFlags src_access_mask = get_access_flags(old_layout);
|
||||||
|
vk::AccessFlags dst_access_mask = get_access_flags(new_layout);
|
||||||
|
|
||||||
|
image_layout_transition(command_buffer, image, src_stage_mask, dst_stage_mask, src_access_mask, dst_access_mask, old_layout, new_layout, subresource_range);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fixed sub resource on first mip level and layer
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
vk::Image image,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout)
|
||||||
|
{
|
||||||
|
auto subresource_range = vk::ImageSubresourceRange{}
|
||||||
|
.setAspectMask(vk::ImageAspectFlagBits::eColor)
|
||||||
|
.setBaseMipLevel(0)
|
||||||
|
.setLevelCount(1)
|
||||||
|
.setBaseArrayLayer(0)
|
||||||
|
.setLayerCount(1);
|
||||||
|
|
||||||
|
image_layout_transition(command_buffer, image, old_layout, new_layout, subresource_range);
|
||||||
|
}
|
||||||
|
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
std::vector<std::pair<vk::Image, vk::ImageSubresourceRange>> const &imagesAndRanges,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout)
|
||||||
|
{
|
||||||
|
vk::PipelineStageFlags src_stage_mask = get_pipeline_stage_flags(old_layout);
|
||||||
|
vk::PipelineStageFlags dst_stage_mask = get_pipeline_stage_flags(new_layout);
|
||||||
|
vk::AccessFlags src_access_mask = get_access_flags(old_layout);
|
||||||
|
vk::AccessFlags dst_access_mask = get_access_flags(new_layout);
|
||||||
|
|
||||||
|
// Create image barrier objects
|
||||||
|
std::vector<vk::ImageMemoryBarrier> image_memory_barriers;
|
||||||
|
for (size_t i = 0; i < imagesAndRanges.size(); i++) {
|
||||||
|
image_memory_barriers.push_back(vk::ImageMemoryBarrier(
|
||||||
|
src_access_mask,
|
||||||
|
dst_access_mask,
|
||||||
|
old_layout,
|
||||||
|
new_layout,
|
||||||
|
VK_QUEUE_FAMILY_IGNORED,
|
||||||
|
VK_QUEUE_FAMILY_IGNORED,
|
||||||
|
imagesAndRanges[i].first,
|
||||||
|
imagesAndRanges[i].second));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Put barriers inside setup command buffer
|
||||||
|
command_buffer.pipelineBarrier(src_stage_mask,
|
||||||
|
dst_stage_mask,
|
||||||
|
{}, {}, {}, image_memory_barriers);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Vulkan
|
|
@ -0,0 +1,28 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "vulkan_hpp_wrapper.hpp"
|
||||||
|
|
||||||
|
namespace Vulkan {
|
||||||
|
|
||||||
|
vk::AccessFlags get_access_flags(vk::ImageLayout layout);
|
||||||
|
vk::PipelineStageFlags get_pipeline_stage_flags(vk::ImageLayout layout);
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
vk::Image image,
|
||||||
|
vk::PipelineStageFlags src_stage_mask,
|
||||||
|
vk::PipelineStageFlags dst_stage_mask,
|
||||||
|
vk::AccessFlags src_access_mask,
|
||||||
|
vk::AccessFlags dst_access_mask,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout,
|
||||||
|
vk::ImageSubresourceRange const &subresource_range);
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
vk::Image image,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout,
|
||||||
|
vk::ImageSubresourceRange const &subresource_range);
|
||||||
|
void image_layout_transition(vk::CommandBuffer command_buffer,
|
||||||
|
vk::Image image,
|
||||||
|
vk::ImageLayout old_layout,
|
||||||
|
vk::ImageLayout new_layout);
|
||||||
|
|
||||||
|
} // namespace Vulkan
|
Loading…
Reference in New Issue