vk_common: Enable beta extensions
* Required to access the portability subset'
This commit is contained in:
@ -95,7 +95,6 @@ add_library(video_core STATIC
|
|||||||
renderer_vulkan/vk_descriptor_manager.h
|
renderer_vulkan/vk_descriptor_manager.h
|
||||||
renderer_vulkan/vk_format_reinterpreter.cpp
|
renderer_vulkan/vk_format_reinterpreter.cpp
|
||||||
renderer_vulkan/vk_format_reinterpreter.h
|
renderer_vulkan/vk_format_reinterpreter.h
|
||||||
renderer_vulkan/vk_layout_tracker.h
|
|
||||||
renderer_vulkan/vk_master_semaphore.cpp
|
renderer_vulkan/vk_master_semaphore.cpp
|
||||||
renderer_vulkan/vk_master_semaphore.h
|
renderer_vulkan/vk_master_semaphore.h
|
||||||
renderer_vulkan/vk_rasterizer.cpp
|
renderer_vulkan/vk_rasterizer.cpp
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|
||||||
// Include vulkan-hpp header
|
// Include vulkan-hpp header
|
||||||
|
#define VK_ENABLE_BETA_EXTENSIONS
|
||||||
#define VK_NO_PROTOTYPES 1
|
#define VK_NO_PROTOTYPES 1
|
||||||
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
|
#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
|
||||||
#define VULKAN_HPP_NO_CONSTRUCTORS
|
#define VULKAN_HPP_NO_CONSTRUCTORS
|
||||||
|
@ -1,80 +0,0 @@
|
|||||||
// Copyright 2022 Citra Emulator Project
|
|
||||||
// Licensed under GPLv2 or any later version
|
|
||||||
// Refer to the license.txt file included.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "video_core/renderer_vulkan/vk_common.h"
|
|
||||||
|
|
||||||
namespace Vulkan {
|
|
||||||
|
|
||||||
class LayoutTracker {
|
|
||||||
static constexpr u32 LAYOUT_BITS = 3;
|
|
||||||
static constexpr u32 MAX_LAYOUTS = (1 << LAYOUT_BITS);
|
|
||||||
static constexpr u32 LAYOUT_MASK = MAX_LAYOUTS - 1;
|
|
||||||
|
|
||||||
// Build layout pattern masks at compile time for fast range equality checks
|
|
||||||
static constexpr auto LAYOUT_PATTERNS = []() {
|
|
||||||
std::array<u64, MAX_LAYOUTS> patterns{};
|
|
||||||
for (u32 layout = 0; layout < MAX_LAYOUTS; layout++) {
|
|
||||||
for (u32 i = 0; i < 16; i++) {
|
|
||||||
patterns[layout] <<= LAYOUT_BITS;
|
|
||||||
patterns[layout] |= layout;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return patterns;
|
|
||||||
}();
|
|
||||||
|
|
||||||
public:
|
|
||||||
LayoutTracker() = default;
|
|
||||||
|
|
||||||
/// Returns the image layout of the provided level
|
|
||||||
[[nodiscard]] constexpr vk::ImageLayout GetLayout(u32 level) const {
|
|
||||||
const u32 shift = level * LAYOUT_BITS;
|
|
||||||
return static_cast<vk::ImageLayout>((layouts >> shift) & LAYOUT_MASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if the level and layer range provided has the same layout
|
|
||||||
[[nodiscard]] constexpr bool IsRangeEqual(vk::ImageLayout layout, u32 level,
|
|
||||||
u32 level_count) const {
|
|
||||||
const u32 shift = level * LAYOUT_BITS;
|
|
||||||
const u64 range_mask = (1ull << level_count * LAYOUT_BITS) - 1;
|
|
||||||
const u64 pattern = LAYOUT_PATTERNS[static_cast<u64>(layout)];
|
|
||||||
return ((layouts >> shift) & range_mask) == (pattern & range_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets the image layout of the provided level
|
|
||||||
constexpr void SetLayout(vk::ImageLayout layout, u32 level, u32 level_count = 1) {
|
|
||||||
const u32 shift = level * LAYOUT_BITS;
|
|
||||||
const u64 range_mask = (1ull << level_count * LAYOUT_BITS) - 1;
|
|
||||||
const u64 pattern = LAYOUT_PATTERNS[static_cast<u64>(layout)];
|
|
||||||
layouts &= ~(range_mask << shift);
|
|
||||||
layouts |= (pattern & range_mask) << shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calls func for each continuous layout range
|
|
||||||
template <typename T>
|
|
||||||
void ForEachLayoutRange(u32 level, u32 level_count, vk::ImageLayout new_layout, T&& func) {
|
|
||||||
u32 start_level = level;
|
|
||||||
u32 end_level = level + level_count;
|
|
||||||
auto current_layout = GetLayout(level);
|
|
||||||
|
|
||||||
while (level < end_level) {
|
|
||||||
level++;
|
|
||||||
const auto layout = GetLayout(level);
|
|
||||||
if (layout != current_layout || level == end_level) {
|
|
||||||
if (current_layout != new_layout) {
|
|
||||||
func(start_level, level - start_level, current_layout);
|
|
||||||
}
|
|
||||||
current_layout = layout;
|
|
||||||
start_level = level;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
u64 layouts{};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Vulkan
|
|
@ -191,8 +191,6 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma
|
|||||||
|
|
||||||
ImageAlloc alloc{};
|
ImageAlloc alloc{};
|
||||||
alloc.format = format;
|
alloc.format = format;
|
||||||
alloc.levels = std::log2(std::max(width, height)) + 1;
|
|
||||||
alloc.layers = type == VideoCore::TextureType::CubeMap ? 6 : 1;
|
|
||||||
alloc.aspect = GetImageAspect(format);
|
alloc.aspect = GetImageAspect(format);
|
||||||
|
|
||||||
// The internal format does not provide enough guarantee of texture uniqueness
|
// The internal format does not provide enough guarantee of texture uniqueness
|
||||||
@ -214,6 +212,8 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma
|
|||||||
}
|
}
|
||||||
|
|
||||||
const bool create_storage_view = pixel_format == VideoCore::PixelFormat::RGBA8;
|
const bool create_storage_view = pixel_format == VideoCore::PixelFormat::RGBA8;
|
||||||
|
const u32 levels = std::log2(std::max(width, height)) + 1;
|
||||||
|
const u32 layers = type == VideoCore::TextureType::CubeMap ? 6 : 1;
|
||||||
|
|
||||||
vk::ImageCreateFlags flags;
|
vk::ImageCreateFlags flags;
|
||||||
if (type == VideoCore::TextureType::CubeMap) {
|
if (type == VideoCore::TextureType::CubeMap) {
|
||||||
@ -228,8 +228,8 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma
|
|||||||
.imageType = vk::ImageType::e2D,
|
.imageType = vk::ImageType::e2D,
|
||||||
.format = format,
|
.format = format,
|
||||||
.extent = {width, height, 1},
|
.extent = {width, height, 1},
|
||||||
.mipLevels = alloc.levels,
|
.mipLevels = levels,
|
||||||
.arrayLayers = alloc.layers,
|
.arrayLayers = layers,
|
||||||
.samples = vk::SampleCountFlagBits::e1,
|
.samples = vk::SampleCountFlagBits::e1,
|
||||||
.usage = usage,
|
.usage = usage,
|
||||||
};
|
};
|
||||||
@ -261,33 +261,31 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma
|
|||||||
.image = alloc.image,
|
.image = alloc.image,
|
||||||
.viewType = view_type,
|
.viewType = view_type,
|
||||||
.format = format,
|
.format = format,
|
||||||
.subresourceRange =
|
.subresourceRange{
|
||||||
{
|
.aspectMask = alloc.aspect,
|
||||||
.aspectMask = alloc.aspect,
|
.baseMipLevel = 0,
|
||||||
.baseMipLevel = 0,
|
.levelCount = levels,
|
||||||
.levelCount = alloc.levels,
|
.baseArrayLayer = 0,
|
||||||
.baseArrayLayer = 0,
|
.layerCount = layers,
|
||||||
.layerCount = alloc.layers,
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
vk::Device device = instance.GetDevice();
|
vk::Device device = instance.GetDevice();
|
||||||
alloc.image_view = device.createImageView(view_info);
|
alloc.image_view = device.createImageView(view_info);
|
||||||
|
|
||||||
// Also create a base mip view in case this is used as an attachment
|
// Also create a base mip view in case this is used as an attachment
|
||||||
if (alloc.levels > 1) [[likely]] {
|
if (levels > 1) [[likely]] {
|
||||||
const vk::ImageViewCreateInfo base_view_info = {
|
const vk::ImageViewCreateInfo base_view_info = {
|
||||||
.image = alloc.image,
|
.image = alloc.image,
|
||||||
.viewType = view_type,
|
.viewType = view_type,
|
||||||
.format = format,
|
.format = format,
|
||||||
.subresourceRange =
|
.subresourceRange{
|
||||||
{
|
.aspectMask = alloc.aspect,
|
||||||
.aspectMask = alloc.aspect,
|
.baseMipLevel = 0,
|
||||||
.baseMipLevel = 0,
|
.levelCount = 1,
|
||||||
.levelCount = 1,
|
.baseArrayLayer = 0,
|
||||||
.baseArrayLayer = 0,
|
.layerCount = layers,
|
||||||
.layerCount = alloc.layers,
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
alloc.base_view = device.createImageView(base_view_info);
|
alloc.base_view = device.createImageView(base_view_info);
|
||||||
@ -299,14 +297,13 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma
|
|||||||
.image = alloc.image,
|
.image = alloc.image,
|
||||||
.viewType = view_type,
|
.viewType = view_type,
|
||||||
.format = format,
|
.format = format,
|
||||||
.subresourceRange =
|
.subresourceRange{
|
||||||
{
|
.aspectMask = vk::ImageAspectFlagBits::eDepth,
|
||||||
.aspectMask = vk::ImageAspectFlagBits::eDepth,
|
.baseMipLevel = 0,
|
||||||
.baseMipLevel = 0,
|
.levelCount = levels,
|
||||||
.levelCount = alloc.levels,
|
.baseArrayLayer = 0,
|
||||||
.baseArrayLayer = 0,
|
.layerCount = layers,
|
||||||
.layerCount = alloc.layers,
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
alloc.depth_view = device.createImageView(view_info);
|
alloc.depth_view = device.createImageView(view_info);
|
||||||
@ -319,14 +316,13 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma
|
|||||||
.image = alloc.image,
|
.image = alloc.image,
|
||||||
.viewType = view_type,
|
.viewType = view_type,
|
||||||
.format = vk::Format::eR32Uint,
|
.format = vk::Format::eR32Uint,
|
||||||
.subresourceRange =
|
.subresourceRange{
|
||||||
{
|
.aspectMask = alloc.aspect,
|
||||||
.aspectMask = alloc.aspect,
|
.baseMipLevel = 0,
|
||||||
.baseMipLevel = 0,
|
.levelCount = levels,
|
||||||
.levelCount = alloc.levels,
|
.baseArrayLayer = 0,
|
||||||
.baseArrayLayer = 0,
|
.layerCount = layers,
|
||||||
.layerCount = alloc.layers,
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
alloc.storage_view = device.createImageView(storage_view_info);
|
alloc.storage_view = device.createImageView(storage_view_info);
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
#include "video_core/renderer_vulkan/vk_blit_helper.h"
|
#include "video_core/renderer_vulkan/vk_blit_helper.h"
|
||||||
#include "video_core/renderer_vulkan/vk_format_reinterpreter.h"
|
#include "video_core/renderer_vulkan/vk_format_reinterpreter.h"
|
||||||
#include "video_core/renderer_vulkan/vk_instance.h"
|
#include "video_core/renderer_vulkan/vk_instance.h"
|
||||||
#include "video_core/renderer_vulkan/vk_layout_tracker.h"
|
|
||||||
#include "video_core/renderer_vulkan/vk_stream_buffer.h"
|
#include "video_core/renderer_vulkan/vk_stream_buffer.h"
|
||||||
|
|
||||||
VK_DEFINE_HANDLE(VmaAllocation)
|
VK_DEFINE_HANDLE(VmaAllocation)
|
||||||
@ -45,9 +44,6 @@ struct ImageAlloc {
|
|||||||
vk::ImageUsageFlags usage;
|
vk::ImageUsageFlags usage;
|
||||||
vk::Format format;
|
vk::Format format;
|
||||||
vk::ImageAspectFlags aspect = vk::ImageAspectFlagBits::eColor;
|
vk::ImageAspectFlags aspect = vk::ImageAspectFlagBits::eColor;
|
||||||
u32 levels = 1;
|
|
||||||
u32 layers = 1;
|
|
||||||
LayoutTracker tracker;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct HostTextureTag {
|
struct HostTextureTag {
|
||||||
|
Reference in New Issue
Block a user