graphics device fixes (#142)

* graphics device fixes

* fix usage of vkAcquireNextImageKHR
This commit is contained in:
Turánszki János
2020-07-13 18:41:19 +01:00
committed by GitHub
parent 6d69960cb6
commit 2b91389273
9 changed files with 79 additions and 84 deletions
+1 -1
View File
@@ -51,7 +51,7 @@ namespace wiGraphics
virtual void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) {}
virtual void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) {}
virtual void Map(const GPUResource* resource, Mapping* mapping = nullptr) = 0;
virtual void Map(const GPUResource* resource, Mapping* mapping) = 0;
virtual void Unmap(const GPUResource* resource) = 0;
virtual void SetName(GPUResource* pResource, const char* name) = 0;
+9 -12
View File
@@ -2375,24 +2375,21 @@ void GraphicsDevice_DX11::Map(const GPUResource* resource, Mapping* mapping)
D3D11_MAPPED_SUBRESOURCE map_result = {};
D3D11_MAP map_type = D3D11_MAP_READ_WRITE;
if (mapping != nullptr)
if (mapping->_flags & Mapping::FLAG_READ)
{
if (mapping->_flags & Mapping::FLAG_READ)
if (mapping->_flags & Mapping::FLAG_WRITE)
{
if (mapping->_flags & Mapping::FLAG_WRITE)
{
map_type = D3D11_MAP_READ_WRITE;
}
else
{
map_type = D3D11_MAP_READ;
}
map_type = D3D11_MAP_READ_WRITE;
}
else if (mapping->_flags & Mapping::FLAG_WRITE)
else
{
map_type = D3D11_MAP_WRITE_NO_OVERWRITE;
map_type = D3D11_MAP_READ;
}
}
else if (mapping->_flags & Mapping::FLAG_WRITE)
{
map_type = D3D11_MAP_WRITE_NO_OVERWRITE;
}
HRESULT hr = immediateContext->Map(internal_state->resource.Get(), 0, map_type, D3D11_MAP_FLAG_DO_NOT_WAIT, &map_result);
mapping->data = map_result.pData;
mapping->rowpitch = map_result.RowPitch;
+1 -1
View File
@@ -94,7 +94,7 @@ namespace wiGraphics
int CreateSubresource(Texture* texture, SUBRESOURCE_TYPE type, uint32_t firstSlice, uint32_t sliceCount, uint32_t firstMip, uint32_t mipCount) override;
void Map(const GPUResource* resource, Mapping* mapping = nullptr) override;
void Map(const GPUResource* resource, Mapping* mapping) override;
void Unmap(const GPUResource* resource) override;
void SetName(GPUResource* pResource, const char* name) override;
+3 -3
View File
@@ -3644,13 +3644,13 @@ using namespace DX12_Internal;
void GraphicsDevice_DX12::Map(const GPUResource* resource, Mapping* mapping)
{
auto internal_state = to_internal(resource);
D3D12_RANGE read_range;
if (mapping != nullptr && mapping->_flags & Mapping::FLAG_READ)
D3D12_RANGE read_range = {};
if (mapping->_flags & Mapping::FLAG_READ)
{
read_range.Begin = mapping->offset;
read_range.End = mapping->size;
}
HRESULT hr = internal_state->resource->Map(0, mapping == nullptr ? nullptr : &read_range, &mapping->data);
HRESULT hr = internal_state->resource->Map(0, &read_range, &mapping->data);
mapping->rowpitch = internal_state->footprint.Footprint.RowPitch;
+1 -1
View File
@@ -196,7 +196,7 @@ namespace wiGraphics
void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) override;
void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) override;
void Map(const GPUResource* resource, Mapping* mapping = nullptr) override;
void Map(const GPUResource* resource, Mapping* mapping) override;
void Unmap(const GPUResource* resource) override;
void SetName(GPUResource* pResource, const char* name) override;
+56 -55
View File
@@ -2530,13 +2530,12 @@ using namespace Vulkan_Internal;
}
GraphicsDevice_Vulkan::~GraphicsDevice_Vulkan()
{
WaitForGPU();
vkQueueWaitIdle(graphicsQueue);
vkQueueWaitIdle(presentQueue);
for (auto& frame : frames)
{
vkDestroyFence(device, frame.frameFence, nullptr);
vkDestroyFramebuffer(device, frame.swapChainFramebuffer, nullptr);
vkDestroyImageView(device, frame.swapChainImageView, nullptr);
for (auto& commandPool : frame.commandPools)
{
vkDestroyCommandPool(device, commandPool, nullptr);
@@ -2566,10 +2565,6 @@ using namespace Vulkan_Internal;
vkDestroyPipeline(device, x.second, nullptr);
}
vkDestroyRenderPass(device, defaultRenderPass, nullptr);
vkDestroySwapchainKHR(device, swapChain, nullptr);
vkDestroyQueryPool(device, querypool_timestamp, nullptr);
vkDestroyQueryPool(device, querypool_occlusion, nullptr);
@@ -2587,6 +2582,15 @@ using namespace Vulkan_Internal;
vkDestroyImageView(device, nullImageView3D, nullptr);
vkDestroySampler(device, nullSampler, nullptr);
vkDestroyRenderPass(device, defaultRenderPass, nullptr);
for (size_t i = 0; i < swapChainImages.size(); ++i)
{
vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr);
vkDestroyImageView(device, swapChainImageViews[i], nullptr);
//vkDestroyImage(device, swapChainImages[i], nullptr);
}
vkDestroySwapchainKHR(device, swapChain, nullptr);
DestroyDebugReportCallbackEXT(instance, callback, nullptr);
vkDestroySurfaceKHR(instance, surface, nullptr);
}
@@ -2653,7 +2657,7 @@ using namespace Vulkan_Internal;
assert(res == VK_SUCCESS);
vkGetSwapchainImagesKHR(device, swapChain, &imageCount, nullptr);
assert(imageCount == BACKBUFFER_COUNT);
assert(BACKBUFFER_COUNT <= imageCount);
swapChainImages.resize(imageCount);
vkGetSwapchainImagesKHR(device, swapChain, &imageCount, swapChainImages.data());
swapChainImageFormat = surfaceFormat.format;
@@ -2670,7 +2674,6 @@ using namespace Vulkan_Internal;
assert(res == VK_SUCCESS);
}
// Create default render pass:
{
VkAttachmentDescription colorAttachment = {};
@@ -2719,54 +2722,52 @@ using namespace Vulkan_Internal;
}
for (uint32_t fr = 0; fr < BACKBUFFER_COUNT; ++fr)
// Create swap chain render targets:
swapChainImageViews.resize(swapChainImages.size());
swapChainFramebuffers.resize(swapChainImages.size());
for (size_t i = 0; i < swapChainImages.size(); ++i)
{
VkImageViewCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
createInfo.image = swapChainImages[i];
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
createInfo.format = swapChainImageFormat;
createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;
// Create swap chain render targets:
if (swapChainImageViews[i] != VK_NULL_HANDLE)
{
VkImageViewCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
createInfo.image = swapChainImages[fr];
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
createInfo.format = swapChainImageFormat;
createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;
if (frames[fr].swapChainImageView != VK_NULL_HANDLE)
{
vkDestroyImageView(device, frames[fr].swapChainImageView, nullptr);
}
res = vkCreateImageView(device, &createInfo, nullptr, &frames[fr].swapChainImageView);
assert(res == VK_SUCCESS);
VkImageView attachments[] = {
frames[fr].swapChainImageView
};
VkFramebufferCreateInfo framebufferInfo = {};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = defaultRenderPass;
framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = attachments;
framebufferInfo.width = swapChainExtent.width;
framebufferInfo.height = swapChainExtent.height;
framebufferInfo.layers = 1;
if (frames[fr].swapChainFramebuffer != VK_NULL_HANDLE)
{
vkDestroyFramebuffer(device, frames[fr].swapChainFramebuffer, nullptr);
}
res = vkCreateFramebuffer(device, &framebufferInfo, nullptr, &frames[fr].swapChainFramebuffer);
assert(res == VK_SUCCESS);
vkDestroyImageView(device, swapChainImageViews[i], nullptr);
}
res = vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]);
assert(res == VK_SUCCESS);
VkImageView attachments[] = {
swapChainImageViews[i]
};
VkFramebufferCreateInfo framebufferInfo = {};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = defaultRenderPass;
framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = attachments;
framebufferInfo.width = swapChainExtent.width;
framebufferInfo.height = swapChainExtent.height;
framebufferInfo.layers = 1;
if (swapChainFramebuffers[i] != VK_NULL_HANDLE)
{
vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr);
}
res = vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]);
assert(res == VK_SUCCESS);
}
}
@@ -4705,10 +4706,12 @@ using namespace Vulkan_Internal;
{
VkClearValue clearColor = { 0.0f, 0.0f, 0.0f, 1.0f };
vkAcquireNextImageKHR(device, swapChain, 0xFFFFFFFFFFFFFFFF, imageAvailableSemaphore, VK_NULL_HANDLE, &swapChainImageIndex);
VkRenderPassBeginInfo renderPassInfo = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
renderPassInfo.renderPass = defaultRenderPass;
renderPassInfo.framebuffer = GetFrameResources().swapChainFramebuffer;
renderPassInfo.framebuffer = swapChainFramebuffers[swapChainImageIndex];
renderPassInfo.renderArea.offset = { 0, 0 };
renderPassInfo.renderArea.extent = swapChainExtent;
renderPassInfo.clearValueCount = 1;
@@ -4720,8 +4723,6 @@ using namespace Vulkan_Internal;
{
vkCmdEndRenderPass(GetDirectCommandList(cmd));
vkAcquireNextImageKHR(device, swapChain, 0xFFFFFFFFFFFFFFFF, imageAvailableSemaphore, VK_NULL_HANDLE, &swapChainImageIndex);
SubmitCommandLists();
VkPresentInfoKHR presentInfo = {};
+3 -3
View File
@@ -75,6 +75,8 @@ namespace wiGraphics
VkExtent2D swapChainExtent;
uint32_t swapChainImageIndex = 0;
std::vector<VkImage> swapChainImages;
std::vector<VkImageView> swapChainImageViews;
std::vector<VkFramebuffer> swapChainFramebuffers;
VkRenderPass defaultRenderPass = VK_NULL_HANDLE;
@@ -116,8 +118,6 @@ namespace wiGraphics
VkFence frameFence = VK_NULL_HANDLE;
VkCommandPool commandPools[COMMANDLIST_COUNT] = {};
VkCommandBuffer commandBuffers[COMMANDLIST_COUNT] = {};
VkImageView swapChainImageView = VK_NULL_HANDLE;
VkFramebuffer swapChainFramebuffer = VK_NULL_HANDLE;
VkQueue copyQueue = VK_NULL_HANDLE;
VkCommandPool copyCommandPool = VK_NULL_HANDLE;
@@ -244,7 +244,7 @@ namespace wiGraphics
void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) override;
void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) override;
void Map(const GPUResource* resource, Mapping* mapping = nullptr) override;
void Map(const GPUResource* resource, Mapping* mapping) override;
void Unmap(const GPUResource* resource) override;
void SetName(GPUResource* pResource, const char* name) override;
+4 -4
View File
@@ -1,6 +1,6 @@
#include "wiVersion.h"
#include <sstream>
#include <string>
namespace wiVersion
{
@@ -9,7 +9,7 @@ namespace wiVersion
// minor features, major updates, breaking API changes
const int minor = 47;
// minor bug fixes, alterations, refactors, updates
const int revision = 0;
const int revision = 1;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);
@@ -29,9 +29,9 @@ namespace wiVersion
{
return revision;
}
const std::string& GetVersionString()
const char* GetVersionString()
{
return version_string;
return version_string.c_str();
}
}
+1 -4
View File
@@ -1,10 +1,7 @@
#ifndef WICKEDENGINE_VERSION_DEFINED
#define WICKEDENGINE_VERSION_DEFINED
#include "CommonInclude.h"
#include <string>
namespace wiVersion
{
long GetVersion();
@@ -14,7 +11,7 @@ namespace wiVersion
int GetMinor();
// minor bug fixes, alterations
int GetRevision();
const std::string& GetVersionString();
const char* GetVersionString();
}
#endif // WICKEDENGINE_VERSION_DEFINED