Merge pull request 'Depth Queries & Sampler Config extension' (#96) into master
This commit is contained in:
@@ -228,7 +228,6 @@ namespace OpenVulkano::AR::ArKit
|
||||
}
|
||||
OnNewFrameAvailable();
|
||||
m_frame = arFrame;
|
||||
Logger::AR->info("Exposure: {}; ColTemp: {}", 1.0/frame.camera.exposureDuration, frame.lightEstimate.ambientColorTemperature);
|
||||
}
|
||||
|
||||
void ArSessionArKitInternal::OnArSessionInterruptedChanged(ARSession* session, bool interrupted)
|
||||
|
||||
@@ -35,5 +35,8 @@ namespace OpenVulkano
|
||||
virtual Scene::UI::Ui* GetActiveUi() = 0;
|
||||
|
||||
virtual IResourceManager* GetIResourceManager() = 0;
|
||||
|
||||
virtual float GetLastQueriedDepthValue() = 0;
|
||||
virtual void SetQueryDepthValue(const Math::Vector2f& depthCoordinates) = 0;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -9,4 +9,11 @@
|
||||
namespace OpenVulkano::Scene
|
||||
{
|
||||
const SamplerConfig SamplerConfig::DEFAULT;
|
||||
const SamplerConfig SamplerConfig::NEAREST(TextureSamplerFilter::NEAREST, TextureSamplerFilter::NEAREST);
|
||||
const SamplerConfig SamplerConfig::LINEAR(TextureSamplerFilter::LINEAR, TextureSamplerFilter::NEAREST);
|
||||
const SamplerConfig SamplerConfig::BILINEAR(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR);
|
||||
const SamplerConfig SamplerConfig::TIRILINEAR(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR);
|
||||
const SamplerConfig SamplerConfig::ANISOTROPIC_LOW(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR, true, 4);
|
||||
const SamplerConfig SamplerConfig::ANISOTROPIC_HIGH(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR, true, 16);
|
||||
const SamplerConfig SamplerConfig::ANISOTROPIC_PRO(TextureSamplerFilter::LINEAR, TextureSamplerFilter::LINEAR, TextureSamplerMipmapMode::LINEAR, true, 32);
|
||||
}
|
||||
@@ -80,10 +80,25 @@ namespace OpenVulkano::Scene
|
||||
, minLod(minLod), maxLod(maxLod), borderColor(borderColor), unnormalizedCoordinates(unnormalizedCoordinates)
|
||||
{}
|
||||
|
||||
SamplerConfig(TextureSamplerFilter magFilter, TextureSamplerFilter minFilter = TextureSamplerFilter::LINEAR,
|
||||
TextureSamplerMipmapMode mipmapMode = TextureSamplerMipmapMode::NEAREST,
|
||||
bool32_t anisotropyEnabled = false, float maxAnisotropy = 0)
|
||||
: magFilter(magFilter), minFilter(minFilter), mipmapMode(mipmapMode), anisotropyEnabled(anisotropyEnabled), maxAnisotropy(maxAnisotropy)
|
||||
{}
|
||||
|
||||
auto operator <=>(const SamplerConfig& other) const = default;
|
||||
|
||||
public:
|
||||
// Default configs
|
||||
static const SamplerConfig DEFAULT;
|
||||
static const SamplerConfig NEAREST;
|
||||
static const SamplerConfig LINEAR;
|
||||
static const SamplerConfig BILINEAR;
|
||||
static const SamplerConfig TIRILINEAR;
|
||||
static const SamplerConfig ANISOTROPIC_LOW;
|
||||
static const SamplerConfig ANISOTROPIC_HIGH;
|
||||
|
||||
// Not supported on most consumer grphics cards!
|
||||
static const SamplerConfig ANISOTROPIC_PRO;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@ namespace OpenVulkano::Scene
|
||||
bool dynamicViewport = true; // If disabled the swapchains fullscreen viewport will always be used, regardless of framebuffer or viewport
|
||||
|
||||
Shader() = default;
|
||||
~Shader() override { /*if (renderShader) Shader::Close();*/ }
|
||||
~Shader() override { if (renderShader) Shader::Close(); }
|
||||
|
||||
Shader& AddShaderProgram(const ShaderProgram& shaderProgram)
|
||||
{
|
||||
|
||||
96
openVulkanoCpp/Vulkan/DepthBufferQuery.cpp
Normal file
96
openVulkanoCpp/Vulkan/DepthBufferQuery.cpp
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include "DepthBufferQuery.hpp"
|
||||
#include "Renderer.hpp"
|
||||
#include <vulkan/vulkan.hpp>
|
||||
|
||||
//TODO resize
|
||||
|
||||
namespace OpenVulkano::Vulkan
|
||||
{
|
||||
void DepthBufferQuery::Init()
|
||||
{
|
||||
auto device = renderer.GetContext().device->device;
|
||||
|
||||
vk::BufferCreateInfo bufferInfo = { {}, 25 * sizeof(float), vk::BufferUsageFlagBits::eTransferDst };
|
||||
bufferDepth = device.createBuffer(bufferInfo);
|
||||
const vk::MemoryRequirements memRequirements = device.getBufferMemoryRequirements(bufferDepth);
|
||||
size_t size = memRequirements.size;
|
||||
const vk::MemoryAllocateInfo memAllocInfo = { size, renderer.GetContext().device->GetMemoryType(memRequirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible) };
|
||||
|
||||
memory = device.allocateMemory(memAllocInfo);
|
||||
cpuDepthBuffer = static_cast<float*>(device.mapMemory(memory, 0, VK_WHOLE_SIZE, {}));
|
||||
|
||||
device.bindBufferMemory(bufferDepth, memory, 0);
|
||||
}
|
||||
|
||||
void DepthBufferQuery::Close()
|
||||
{
|
||||
auto device = renderer.GetContext().device->device;
|
||||
device.destroy(bufferDepth);
|
||||
device.unmapMemory(memory);
|
||||
device.free(memory);
|
||||
cpuDepthBuffer = nullptr;
|
||||
}
|
||||
|
||||
void DepthBufferQuery::Resize(uint32_t width, uint32_t height)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
float DepthBufferQuery::GetQueriedValue() const
|
||||
{
|
||||
if (cpuDepthBuffer[0] == -2) return -2;
|
||||
if (cpuDepthBuffer[12] > 0 && cpuDepthBuffer[12] < 1) return cpuDepthBuffer[12];
|
||||
double val = 0;
|
||||
int validCount = 0;
|
||||
for (int i = 0; i < 25; i++)
|
||||
{
|
||||
float f = cpuDepthBuffer[i];
|
||||
if (f > 0 && f < 1)
|
||||
{
|
||||
val += f;
|
||||
validCount++;
|
||||
}
|
||||
}
|
||||
if (validCount == 0) return 1; // Prevent divide by 0
|
||||
return val / validCount;
|
||||
}
|
||||
|
||||
vk::Offset3D DepthBufferQuery::GetCopyOffset() const
|
||||
{
|
||||
vk::Extent3D depthExtent = renderer.GetContext().swapChain.GetCurrentDepthBuffer().extent;
|
||||
|
||||
int32_t x = static_cast<int32_t>(depthQueryCoordinates.x * depthExtent.width);
|
||||
x = std::min<int32_t>(depthExtent.width - 5, std::max(0, x));
|
||||
|
||||
int32_t y = static_cast<int32_t>(depthQueryCoordinates.y * depthExtent.height);
|
||||
y = std::min<int32_t>(depthExtent.height - 5, std::max(0, y));
|
||||
|
||||
return { x, y, 0 };
|
||||
}
|
||||
|
||||
void DepthBufferQuery::Encode(vk::CommandBuffer& commandBuffer)
|
||||
{
|
||||
if (!copyDepthBuffer) return;
|
||||
copyDepthBuffer = false;
|
||||
std::fill(cpuDepthBuffer, cpuDepthBuffer + 25, -2.0f); // Invalidate data in buffer to allow detecting if copy is done
|
||||
const vk::ImageAspectFlags aspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil;
|
||||
const Image& depthBufferImage = renderer.GetContext().swapChain.GetCurrentDepthBuffer();
|
||||
|
||||
constexpr vk::Extent3D copySize = { 5, 5, 1 };
|
||||
const vk::ImageSubresourceLayers layout = { vk::ImageAspectFlagBits::eDepth, 0, 0, 1 };
|
||||
vk::BufferImageCopy imgCopy = { 0, 5, 5, layout, GetCopyOffset(), copySize };
|
||||
|
||||
const vk::ImageMemoryBarrier imgMemBarrier({}, vk::AccessFlagBits::eTransferRead, vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eTransferSrcOptimal, 0, 0, depthBufferImage.image, vk::ImageSubresourceRange(aspectMask, 0, 1, 0, 1));
|
||||
commandBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, nullptr, nullptr, imgMemBarrier);
|
||||
|
||||
commandBuffer.copyImageToBuffer(depthBufferImage.image, vk::ImageLayout::eTransferSrcOptimal, bufferDepth, 1, &imgCopy);
|
||||
|
||||
depthBufferImage.SetLayout(commandBuffer, aspectMask, vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eTransferSrcOptimal);
|
||||
}
|
||||
}
|
||||
48
openVulkanoCpp/Vulkan/DepthBufferQuery.hpp
Normal file
48
openVulkanoCpp/Vulkan/DepthBufferQuery.hpp
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Math/Math.hpp"
|
||||
#include "Vulkan/Image.hpp"
|
||||
|
||||
namespace OpenVulkano::Vulkan
|
||||
{
|
||||
class Renderer;
|
||||
|
||||
class DepthBufferQuery final
|
||||
{
|
||||
Renderer& renderer;
|
||||
vk::DeviceMemory memory;
|
||||
vk::Buffer bufferDepth;
|
||||
float* cpuDepthBuffer = nullptr;
|
||||
Math::Vector2f depthQueryCoordinates = { 0.5f, 0.5f };
|
||||
bool copyDepthBuffer = true;
|
||||
|
||||
vk::Offset3D GetCopyOffset() const;
|
||||
|
||||
public:
|
||||
DepthBufferQuery(Renderer& renderer): renderer(renderer) {}
|
||||
|
||||
~DepthBufferQuery() { if (cpuDepthBuffer != nullptr) Close(); }
|
||||
|
||||
void Init();
|
||||
|
||||
void Close();
|
||||
|
||||
void Encode(vk::CommandBuffer& commandBuffer);
|
||||
|
||||
void Resize(uint32_t width, uint32_t height);
|
||||
|
||||
float GetQueriedValue() const;
|
||||
|
||||
void SetQueryCoordinates(const Math::Vector2f& coords)
|
||||
{
|
||||
copyDepthBuffer = true;
|
||||
depthQueryCoordinates = coords;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -90,5 +90,7 @@ namespace OpenVulkano::Vulkan
|
||||
[[nodiscard]] const vk::Viewport& GetFullscreenViewport() const { return fullscreenViewport; }
|
||||
|
||||
[[nodiscard]] const vk::Rect2D& GetFullscreenScissor() const { return fullscreenScissor; }
|
||||
|
||||
[[nodiscard]] const Image& GetCurrentDepthBuffer() { return depthBuffer; }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace OpenVulkano::Vulkan
|
||||
if (m_frameBuffer->UseDepthBuffer())
|
||||
{ // Depth attachment
|
||||
attachments.emplace_back(vk::AttachmentDescriptionFlags(), m_frameBuffer->GetDepthFormat(), vk::SampleCountFlagBits::e1,
|
||||
m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eDontCare, m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad,
|
||||
m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eStore, m_useClearDepth ? vk::AttachmentLoadOp::eClear : vk::AttachmentLoadOp::eLoad,
|
||||
vk::AttachmentStoreOp::eDontCare, vk::ImageLayout::eDepthStencilAttachmentOptimal, vk::ImageLayout::eDepthStencilAttachmentOptimal);
|
||||
depthReference = new vk::AttachmentReference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
|
||||
namespace OpenVulkano::Vulkan
|
||||
{
|
||||
Renderer::Renderer()
|
||||
: depthBufferQuery(*this)
|
||||
{
|
||||
}
|
||||
|
||||
void Renderer::Init(IGraphicsAppManager* graphicsAppManager, IWindow* window)
|
||||
{
|
||||
logger = Logger::RENDER;
|
||||
@@ -62,6 +67,8 @@ namespace OpenVulkano::Vulkan
|
||||
}
|
||||
}
|
||||
|
||||
depthBufferQuery.Init();
|
||||
|
||||
logger->info("Vulkan renderer initialized");
|
||||
}
|
||||
|
||||
@@ -87,6 +94,7 @@ namespace OpenVulkano::Vulkan
|
||||
closeables.pop_back();
|
||||
closeable->Close();
|
||||
}
|
||||
depthBufferQuery.Close();
|
||||
uiRenderer.Close();
|
||||
resourceManager.Close();
|
||||
commands.clear();
|
||||
@@ -106,7 +114,7 @@ namespace OpenVulkano::Vulkan
|
||||
resourceManager.Resize();
|
||||
}
|
||||
|
||||
CommandHelper* Renderer::GetCommandData(uint32_t poolId)
|
||||
CommandHelper* Renderer::GetCommandData(size_t poolId)
|
||||
{
|
||||
return &commands[poolId][currentImageId];
|
||||
}
|
||||
@@ -138,6 +146,7 @@ namespace OpenVulkano::Vulkan
|
||||
CommandHelper* cmdHelper = GetCommandData(commands.size() - 1);
|
||||
cmdHelper->cmdBuffer.executeCommands(submitBuffers[currentImageId].size(), submitBuffers[currentImageId].data());
|
||||
context.swapChainRenderPass.End(cmdHelper->cmdBuffer);
|
||||
depthBufferQuery.Encode(cmdHelper->cmdBuffer);
|
||||
uiRenderer.DrawUiFrame(cmdHelper->cmdBuffer);
|
||||
cmdHelper->cmdBuffer.end();
|
||||
std::array<vk::PipelineStageFlags, 2> stateFlags = { vk::PipelineStageFlags(vk::PipelineStageFlagBits::eColorAttachmentOutput), vk::PipelineStageFlags(vk::PipelineStageFlagBits::eColorAttachmentOutput) };
|
||||
@@ -164,7 +173,7 @@ namespace OpenVulkano::Vulkan
|
||||
Submit();
|
||||
}
|
||||
|
||||
void Renderer::RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue<Scene::Drawable*>* jobQueue, uint32_t poolId)
|
||||
void Renderer::RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue<Scene::Drawable*>* jobQueue, size_t poolId)
|
||||
{
|
||||
CommandHelper* cmdHelper = GetCommandData(poolId);
|
||||
cmdHelper->Reset();
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "CommandHelper.hpp"
|
||||
#include "Base/EngineConfiguration.hpp"
|
||||
#include "Resources/ResourceManager.hpp"
|
||||
#include "DepthBufferQuery.hpp"
|
||||
#include <vector>
|
||||
#include <thread>
|
||||
|
||||
@@ -40,9 +41,10 @@ namespace OpenVulkano::Vulkan
|
||||
std::vector<std::vector<vk::CommandBuffer>> submitBuffers;
|
||||
UiRenderer uiRenderer;
|
||||
std::vector<ICloseable*> closeables;
|
||||
DepthBufferQuery depthBufferQuery;
|
||||
|
||||
public:
|
||||
Renderer() = default;
|
||||
Renderer();
|
||||
~Renderer() override = default;
|
||||
|
||||
void Init(IGraphicsAppManager* graphicsAppManager, IWindow* window) override;
|
||||
@@ -63,7 +65,7 @@ namespace OpenVulkano::Vulkan
|
||||
|
||||
Scene::UI::Ui* GetActiveUi() override { return uiRenderer.GetActiveUi(); }
|
||||
|
||||
CommandHelper* GetCommandData(uint32_t poolId);
|
||||
CommandHelper* GetCommandData(size_t poolId);
|
||||
|
||||
static void RunThread(Renderer* renderer, Data::ReadOnlyAtomicArrayQueue<Scene::Drawable*>* jobQueue, uint32_t id);
|
||||
|
||||
@@ -75,7 +77,7 @@ namespace OpenVulkano::Vulkan
|
||||
|
||||
void Render();
|
||||
|
||||
void RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue<Scene::Drawable*>* jobQueue, uint32_t poolId);
|
||||
void RecordSecondaryBuffer(Data::ReadOnlyAtomicArrayQueue<Scene::Drawable*>* jobQueue, size_t poolId);
|
||||
|
||||
ResourceManager& GetResourceManager() { return resourceManager; }
|
||||
|
||||
@@ -86,5 +88,9 @@ namespace OpenVulkano::Vulkan
|
||||
void UnregisterCloseable(ICloseable* closeable) { Utils::Remove(closeables, closeable); }
|
||||
|
||||
IResourceManager* GetIResourceManager() override { return &resourceManager; }
|
||||
|
||||
|
||||
float GetLastQueriedDepthValue() override { return depthBufferQuery.GetQueriedValue(); }
|
||||
void SetQueryDepthValue(const Math::Vector2f& depthCoordinates) override { depthBufferQuery.SetQueryCoordinates(depthCoordinates); }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace OpenVulkano::Vulkan
|
||||
* \return The pointer to the mapped buffer.
|
||||
*/
|
||||
template <typename T = void>
|
||||
T* Map(size_t offset = 0, vk::DeviceSize size = VK_WHOLE_SIZE, bool longTermMapping = true)
|
||||
T* Map(vk::DeviceSize offset = 0, vk::DeviceSize size = VK_WHOLE_SIZE, bool longTermMapping = true)
|
||||
{
|
||||
if (!mapped)
|
||||
{
|
||||
@@ -106,7 +106,7 @@ namespace OpenVulkano::Vulkan
|
||||
}
|
||||
}
|
||||
|
||||
void Copy(const void* data, uint32_t size, uint32_t offset)
|
||||
void Copy(const void* data, vk::DeviceSize size, vk::DeviceSize offset)
|
||||
{
|
||||
if(mapped) memcpy(static_cast<char*>(mapped) + offset, data, size);
|
||||
else
|
||||
|
||||
@@ -17,8 +17,15 @@ namespace OpenVulkano::Vulkan
|
||||
|
||||
VulkanShader::~VulkanShader()
|
||||
{
|
||||
if (!shader) return;
|
||||
Close();
|
||||
if (shader) Close();
|
||||
device.destroyPipeline(pipeline);
|
||||
for(auto& shaderModule : shaderModules)
|
||||
{
|
||||
device.destroyShaderModule(shaderModule);
|
||||
}
|
||||
device.destroyPipelineLayout(pipelineLayout);
|
||||
for(auto& descriptorSetLayout : descriptorSetLayouts)
|
||||
device.destroyDescriptorSetLayout(descriptorSetLayout);
|
||||
}
|
||||
|
||||
void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner)
|
||||
@@ -63,12 +70,12 @@ namespace OpenVulkano::Vulkan
|
||||
if (shader->vertexInputDescriptions.size() == 1)
|
||||
{ // Reuse already existing vertex attribute description
|
||||
static_assert(sizeof(VertexInputParameter) == sizeof(vk::VertexInputAttributeDescription));
|
||||
attributeDescriptionsSize = shader->vertexInputDescriptions[0].inputParameters.size();
|
||||
attributeDescriptionsSize = static_cast<uint32_t>(shader->vertexInputDescriptions[0].inputParameters.size());
|
||||
attributeDescriptionsData = reinterpret_cast<vk::VertexInputAttributeDescription*>(shader->vertexInputDescriptions[0].inputParameters.data());
|
||||
}
|
||||
else
|
||||
{
|
||||
attributeDescriptionsSize = attributeDescriptions.size();
|
||||
attributeDescriptionsSize = static_cast<uint32_t>(attributeDescriptions.size());
|
||||
attributeDescriptionsData = attributeDescriptions.data();
|
||||
}
|
||||
|
||||
@@ -125,16 +132,9 @@ namespace OpenVulkano::Vulkan
|
||||
void VulkanShader::Close()
|
||||
{
|
||||
shader->renderShader = nullptr;
|
||||
device.destroyPipeline(pipeline);
|
||||
for(auto& shaderModule : shaderModules)
|
||||
{
|
||||
device.destroyShaderModule(shaderModule);
|
||||
}
|
||||
device.destroyPipelineLayout(pipelineLayout);
|
||||
for(auto& descriptorSetLayout : descriptorSetLayouts)
|
||||
device.destroyDescriptorSetLayout(descriptorSetLayout);
|
||||
shader = nullptr;
|
||||
if (owner) owner->RemoveShader(this);
|
||||
owner = nullptr;
|
||||
}
|
||||
|
||||
void VulkanShader::CreatePipelineLayout()
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace OpenVulkano
|
||||
vk::PresentModeKHR presentMode;
|
||||
std::vector<vk::Semaphore> imageAvailableSemaphores;
|
||||
uint32_t currentSemaphoreId = 0;
|
||||
vk::Extent2D size{0,0};
|
||||
vk::Extent2D size{ 0, 0 };
|
||||
|
||||
public:
|
||||
vk::SwapchainKHR swapChain;
|
||||
@@ -59,10 +59,7 @@ namespace OpenVulkano
|
||||
|
||||
void Resize(uint32_t newWidth, uint32_t newHeight);
|
||||
|
||||
[[nodiscard]] vk::Extent2D GetSize() const
|
||||
{
|
||||
return size;
|
||||
}
|
||||
[[nodiscard]] vk::Extent2D GetSize() const { return size; }
|
||||
|
||||
uint32_t AcquireNextImage(const vk::Fence& fence = vk::Fence());
|
||||
|
||||
@@ -81,10 +78,7 @@ namespace OpenVulkano
|
||||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] uint32_t GetImageCount() const
|
||||
{
|
||||
return images.size();
|
||||
}
|
||||
[[nodiscard]] uint32_t GetImageCount() const { return images.size(); }
|
||||
|
||||
vk::Semaphore& GetCurrentSemaphore() { return imageAvailableSemaphores[currentSemaphoreId]; }
|
||||
|
||||
@@ -96,10 +90,7 @@ namespace OpenVulkano
|
||||
void DestroySwapChain();
|
||||
|
||||
protected:
|
||||
vk::Format FindColorFormat() override
|
||||
{
|
||||
return surfaceFormat.format;
|
||||
}
|
||||
[[nodiscard]] vk::Format FindColorFormat() override { return surfaceFormat.format; }
|
||||
|
||||
virtual vk::PresentModeKHR ChosePresentMode();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user