vulkan: simplify function calls
This commit is contained in:
parent
d22fa54f7b
commit
8426bcad27
|
@ -57,14 +57,14 @@ public:
|
|||
void EndFrame()
|
||||
{
|
||||
std::vector<vk::CommandBuffer> commandBuffers = vk::uniqueToRaw(inFlightBuffers[index]);
|
||||
VulkanContext::Instance()->SubmitCommandBuffers((u32)commandBuffers.size(), commandBuffers.data(), *fences[index]);
|
||||
VulkanContext::Instance()->SubmitCommandBuffers(commandBuffers, *fences[index]);
|
||||
}
|
||||
|
||||
void BeginFrame()
|
||||
{
|
||||
index = (index + 1) % chainSize;
|
||||
VulkanContext::Instance()->GetDevice().waitForFences(1, &fences[index].get(), true, UINT64_MAX);
|
||||
VulkanContext::Instance()->GetDevice().resetFences(1, &fences[index].get());
|
||||
VulkanContext::Instance()->GetDevice().waitForFences(fences[index].get(), true, UINT64_MAX);
|
||||
VulkanContext::Instance()->GetDevice().resetFences(fences[index].get());
|
||||
std::vector<vk::UniqueCommandBuffer>& inFlight = inFlightBuffers[index];
|
||||
std::vector<vk::UniqueCommandBuffer>& freeBuf = freeBuffers[index];
|
||||
std::move(inFlight.begin(), inFlight.end(), std::back_inserter(freeBuf));
|
||||
|
|
|
@ -213,5 +213,5 @@ vk::UniqueShaderModule ShaderCompiler::Compile(vk::ShaderStageFlagBits shaderSta
|
|||
verify(ok);
|
||||
|
||||
return VulkanContext::Instance()->GetDevice().createShaderModuleUnique
|
||||
(vk::ShaderModuleCreateInfo(vk::ShaderModuleCreateFlags(), shaderSPV.size() * sizeof(unsigned int), shaderSPV.data()));
|
||||
(vk::ShaderModuleCreateInfo(vk::ShaderModuleCreateFlags(), shaderSPV));
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public:
|
|||
{
|
||||
std::vector<vk::DescriptorSetLayout> layouts(allocChunk, layout);
|
||||
descSets = VulkanContext::Instance()->GetDevice().allocateDescriptorSetsUnique(
|
||||
vk::DescriptorSetAllocateInfo(VulkanContext::Instance()->GetDescriptorPool(), (u32)layouts.size(), &layouts[0]));
|
||||
vk::DescriptorSetAllocateInfo(VulkanContext::Instance()->GetDescriptorPool(), layouts));
|
||||
}
|
||||
descSetsInFlight[index].emplace_back(std::move(descSets.back()));
|
||||
descSets.pop_back();
|
||||
|
@ -99,7 +99,7 @@ public:
|
|||
{
|
||||
std::vector<vk::DescriptorSetLayout> layouts(allocChunk, layout);
|
||||
descSets = VulkanContext::Instance()->GetDevice().allocateDescriptorSetsUnique(
|
||||
vk::DescriptorSetAllocateInfo(VulkanContext::Instance()->GetDescriptorPool(), (u32)layouts.size(), &layouts[0]));
|
||||
vk::DescriptorSetAllocateInfo(VulkanContext::Instance()->GetDescriptorPool(), layouts));
|
||||
}
|
||||
descSetsInFlight[index].emplace_back(std::move(descSets.back()));
|
||||
descSets.pop_back();
|
||||
|
|
|
@ -210,7 +210,7 @@ void Drawer::DrawModVols(const vk::CommandBuffer& cmdBuffer, int first, int coun
|
|||
return;
|
||||
|
||||
vk::Buffer buffer = GetMainBuffer(0)->buffer.get();
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &buffer, &offsets.modVolOffset);
|
||||
cmdBuffer.bindVertexBuffers(0, buffer, offsets.modVolOffset);
|
||||
SetScissor(cmdBuffer, baseScissor);
|
||||
|
||||
ModifierVolumeParam* params = &pvrrc.global_param_mvo.head()[first];
|
||||
|
@ -249,8 +249,7 @@ void Drawer::DrawModVols(const vk::CommandBuffer& cmdBuffer, int first, int coun
|
|||
mod_base = -1;
|
||||
}
|
||||
}
|
||||
const vk::DeviceSize offset = 0;
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &buffer, &offset);
|
||||
cmdBuffer.bindVertexBuffers(0, buffer, {0});
|
||||
|
||||
std::array<float, 5> pushConstants = { 1 - FPU_SHAD_SCALE.scale_factor / 256.f, 0, 0, 0, 0 };
|
||||
cmdBuffer.pushConstants<float>(pipelineManager->GetPipelineLayout(), vk::ShaderStageFlagBits::eFragment, 0, pushConstants);
|
||||
|
@ -327,9 +326,8 @@ bool Drawer::Draw(const Texture *fogTexture, const Texture *paletteTexture)
|
|||
descriptorSets.bindPerFrameDescriptorSets(cmdBuffer);
|
||||
|
||||
// Bind vertex and index buffers
|
||||
const vk::DeviceSize zeroOffset[] = { 0 };
|
||||
const vk::Buffer buffer = GetMainBuffer(0)->buffer.get();
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &buffer, zeroOffset);
|
||||
cmdBuffer.bindVertexBuffers(0, buffer, {0});
|
||||
cmdBuffer.bindIndexBuffer(buffer, offsets.indexOffset, vk::IndexType::eUint32);
|
||||
|
||||
// Make sure to push constants even if not used
|
||||
|
@ -458,17 +456,17 @@ vk::CommandBuffer TextureDrawer::BeginRenderPass()
|
|||
|
||||
setImageLayout(commandBuffer, colorImage, vk::Format::eR8G8B8A8Unorm, 1, colorImageCurrentLayout, vk::ImageLayout::eColorAttachmentOptimal);
|
||||
|
||||
vk::ImageView imageViews[] = {
|
||||
std::array<vk::ImageView, 2> imageViews = {
|
||||
colorImageView,
|
||||
depthAttachment->GetImageView(),
|
||||
};
|
||||
framebuffers.resize(GetContext()->GetSwapChainSize());
|
||||
framebuffers[GetCurrentImage()] = device.createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(),
|
||||
rttPipelineManager->GetRenderPass(), ARRAY_SIZE(imageViews), imageViews, widthPow2, heightPow2, 1));
|
||||
rttPipelineManager->GetRenderPass(), imageViews, widthPow2, heightPow2, 1));
|
||||
|
||||
const vk::ClearValue clear_colors[] = { vk::ClearColorValue(std::array<float, 4> { 0.f, 0.f, 0.f, 1.f }), vk::ClearDepthStencilValue { 0.f, 0 } };
|
||||
const std::array<vk::ClearValue, 2> clear_colors = { vk::ClearColorValue(std::array<float, 4> { 0.f, 0.f, 0.f, 1.f }), vk::ClearDepthStencilValue { 0.f, 0 } };
|
||||
commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(rttPipelineManager->GetRenderPass(), *framebuffers[GetCurrentImage()],
|
||||
vk::Rect2D( { 0, 0 }, { width, height }), 2, clear_colors), vk::SubpassContents::eInline);
|
||||
vk::Rect2D( { 0, 0 }, { width, height }), clear_colors), vk::SubpassContents::eInline);
|
||||
commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)upscaledWidth, (float)upscaledHeight, 1.0f, 0.0f));
|
||||
u32 minX = pvrrc.fb_X_CLIP.min;
|
||||
u32 minY = pvrrc.fb_Y_CLIP.min;
|
||||
|
@ -490,7 +488,7 @@ void TextureDrawer::EndRenderPass()
|
|||
if (config::RenderToTextureBuffer)
|
||||
{
|
||||
vk::BufferImageCopy copyRegion(0, clippedWidth, clippedHeight, vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, 0, 0, 1), vk::Offset3D(0, 0, 0),
|
||||
vk::Extent3D(vk::Extent2D(clippedWidth, clippedHeight), 1));
|
||||
vk::Extent3D(clippedWidth, clippedHeight, 1));
|
||||
currentCommandBuffer.copyImageToBuffer(colorAttachment->GetImage(), vk::ImageLayout::eTransferSrcOptimal,
|
||||
*colorAttachment->GetBufferData()->buffer, copyRegion);
|
||||
|
||||
|
@ -513,7 +511,7 @@ void TextureDrawer::EndRenderPass()
|
|||
if (config::RenderToTextureBuffer)
|
||||
{
|
||||
vk::Fence fence = commandPool->GetCurrentFence();
|
||||
GetContext()->GetDevice().waitForFences(1, &fence, true, UINT64_MAX);
|
||||
GetContext()->GetDevice().waitForFences(fence, true, UINT64_MAX);
|
||||
|
||||
u16 *dst = (u16 *)&vram[textureAddr];
|
||||
|
||||
|
@ -555,7 +553,7 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan
|
|||
|
||||
if (!renderPassLoad)
|
||||
{
|
||||
vk::AttachmentDescription attachmentDescriptions[] = {
|
||||
std::array<vk::AttachmentDescription, 2> attachmentDescriptions = {
|
||||
// Color attachment
|
||||
vk::AttachmentDescription(vk::AttachmentDescriptionFlags(), GetContext()->GetColorFormat(), vk::SampleCountFlagBits::e1,
|
||||
vk::AttachmentLoadOp::eLoad, vk::AttachmentStoreOp::eStore,
|
||||
|
@ -570,27 +568,25 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan
|
|||
vk::AttachmentReference colorReference(0, vk::ImageLayout::eColorAttachmentOptimal);
|
||||
vk::AttachmentReference depthReference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal);
|
||||
|
||||
vk::SubpassDescription subpasses[] = {
|
||||
vk::SubpassDescription(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics,
|
||||
0, nullptr,
|
||||
1, &colorReference,
|
||||
vk::SubpassDescription subpass(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics,
|
||||
nullptr,
|
||||
&depthReference),
|
||||
};
|
||||
colorReference,
|
||||
nullptr,
|
||||
&depthReference);
|
||||
|
||||
std::vector<vk::SubpassDependency> dependencies;
|
||||
dependencies.emplace_back(0, VK_SUBPASS_EXTERNAL, vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eFragmentShader,
|
||||
vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderRead, vk::DependencyFlagBits::eByRegion);
|
||||
vk::SubpassDependency dependency(0, VK_SUBPASS_EXTERNAL, vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eFragmentShader,
|
||||
vk::AccessFlagBits::eColorAttachmentWrite, vk::AccessFlagBits::eShaderRead,vk::DependencyFlagBits::eByRegion);
|
||||
|
||||
renderPassLoad = GetContext()->GetDevice().createRenderPassUnique(vk::RenderPassCreateInfo(vk::RenderPassCreateFlags(),
|
||||
ARRAY_SIZE(attachmentDescriptions), attachmentDescriptions,
|
||||
ARRAY_SIZE(subpasses), subpasses,
|
||||
dependencies.size(), dependencies.data()));
|
||||
attachmentDescriptions,
|
||||
subpass,
|
||||
dependency));
|
||||
|
||||
attachmentDescriptions[0].loadOp = vk::AttachmentLoadOp::eClear;
|
||||
renderPassClear = GetContext()->GetDevice().createRenderPassUnique(vk::RenderPassCreateInfo(vk::RenderPassCreateFlags(),
|
||||
ARRAY_SIZE(attachmentDescriptions), attachmentDescriptions,
|
||||
ARRAY_SIZE(subpasses), subpasses,
|
||||
dependencies.size(), dependencies.data()));
|
||||
attachmentDescriptions,
|
||||
subpass,
|
||||
dependency));
|
||||
}
|
||||
size_t size = GetSwapChainSize();
|
||||
if (colorAttachments.size() > size)
|
||||
|
@ -602,7 +598,7 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan
|
|||
}
|
||||
else
|
||||
{
|
||||
vk::ImageView attachments[] = {
|
||||
std::array<vk::ImageView, 2> attachments = {
|
||||
nullptr,
|
||||
depthAttachment->GetImageView(),
|
||||
};
|
||||
|
@ -614,7 +610,7 @@ void ScreenDrawer::Init(SamplerManager *samplerManager, ShaderManager *shaderMan
|
|||
vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled);
|
||||
attachments[0] = colorAttachments.back()->GetImageView();
|
||||
vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), *renderPassLoad,
|
||||
ARRAY_SIZE(attachments), attachments, viewport.width, viewport.height, 1);
|
||||
attachments, viewport.width, viewport.height, 1);
|
||||
framebuffers.push_back(GetContext()->GetDevice().createFramebufferUnique(createInfo));
|
||||
transitionNeeded.push_back(true);
|
||||
clearNeeded.push_back(true);
|
||||
|
@ -642,9 +638,9 @@ vk::CommandBuffer ScreenDrawer::BeginRenderPass()
|
|||
|
||||
vk::RenderPass renderPass = clearNeeded[GetCurrentImage()] ? *renderPassClear : *renderPassLoad;
|
||||
clearNeeded[GetCurrentImage()] = false;
|
||||
const vk::ClearValue clear_colors[] = { vk::ClearColorValue(std::array<float, 4> { 0.f, 0.f, 0.f, 1.f }), vk::ClearDepthStencilValue { 0.f, 0 } };
|
||||
const std::array<vk::ClearValue, 2> clear_colors = { vk::ClearColorValue(std::array<float, 4> { 0.f, 0.f, 0.f, 1.f }), vk::ClearDepthStencilValue { 0.f, 0 } };
|
||||
commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(renderPass, *framebuffers[GetCurrentImage()],
|
||||
vk::Rect2D( { 0, 0 }, viewport), 2, clear_colors), vk::SubpassContents::eInline);
|
||||
vk::Rect2D( { 0, 0 }, viewport), clear_colors), vk::SubpassContents::eInline);
|
||||
commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)viewport.width, (float)viewport.height, 1.0f, 0.0f));
|
||||
|
||||
matrices.CalcMatrices(&pvrrc, viewport.width, viewport.height);
|
||||
|
|
|
@ -62,13 +62,13 @@ public:
|
|||
{
|
||||
static vk::DescriptorBufferInfo pixelBufferInfo({}, 0, VK_WHOLE_SIZE);
|
||||
pixelBufferInfo.buffer = *pixelBuffer->buffer;
|
||||
writeDescSets.emplace_back(descSet, 7, 0, 1, vk::DescriptorType::eStorageBuffer, nullptr, &pixelBufferInfo, nullptr);
|
||||
writeDescSets.emplace_back(descSet, 7, 0, vk::DescriptorType::eStorageBuffer, nullptr, pixelBufferInfo);
|
||||
static vk::DescriptorBufferInfo pixelCounterBufferInfo({}, 0, 4);
|
||||
pixelCounterBufferInfo.buffer = *pixelCounter->buffer;
|
||||
writeDescSets.emplace_back(descSet, 8, 0, 1, vk::DescriptorType::eStorageBuffer, nullptr, &pixelCounterBufferInfo, nullptr);
|
||||
writeDescSets.emplace_back(descSet, 8, 0, vk::DescriptorType::eStorageBuffer, nullptr, pixelCounterBufferInfo);
|
||||
static vk::DescriptorBufferInfo abufferPointerInfo({}, 0, VK_WHOLE_SIZE);
|
||||
abufferPointerInfo.buffer = *abufferPointer->buffer;
|
||||
writeDescSets.emplace_back(descSet, 9, 0, 1, vk::DescriptorType::eStorageBuffer, nullptr, &abufferPointerInfo, nullptr);
|
||||
writeDescSets.emplace_back(descSet, 9, 0, vk::DescriptorType::eStorageBuffer, nullptr, abufferPointerInfo);
|
||||
}
|
||||
|
||||
void OnNewFrame(vk::CommandBuffer commandBuffer)
|
||||
|
@ -85,7 +85,7 @@ public:
|
|||
void ResetPixelCounter(vk::CommandBuffer commandBuffer)
|
||||
{
|
||||
vk::BufferCopy copy(0, 0, sizeof(int));
|
||||
commandBuffer.copyBuffer(*pixelCounterReset->buffer, *pixelCounter->buffer, 1, ©);
|
||||
commandBuffer.copyBuffer(*pixelCounterReset->buffer, *pixelCounter->buffer, copy);
|
||||
}
|
||||
|
||||
void Term()
|
||||
|
|
|
@ -134,7 +134,7 @@ void OITDrawer::DrawModifierVolumes(const vk::CommandBuffer& cmdBuffer, int firs
|
|||
return;
|
||||
|
||||
vk::Buffer buffer = GetMainBuffer(0)->buffer.get();
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &buffer, &offsets.modVolOffset);
|
||||
cmdBuffer.bindVertexBuffers(0, buffer, offsets.modVolOffset);
|
||||
SetScissor(cmdBuffer, baseScissor);
|
||||
|
||||
const ModifierVolumeParam *params = &modVolParams[first];
|
||||
|
@ -203,8 +203,7 @@ void OITDrawer::DrawModifierVolumes(const vk::CommandBuffer& cmdBuffer, int firs
|
|||
}
|
||||
}
|
||||
}
|
||||
const vk::DeviceSize offset = 0;
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &buffer, &offset);
|
||||
cmdBuffer.bindVertexBuffers(0, buffer, {0});
|
||||
}
|
||||
|
||||
void OITDrawer::UploadMainBuffer(const OITDescriptorSets::VertexShaderUniforms& vertexUniforms,
|
||||
|
@ -294,8 +293,7 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture)
|
|||
descriptorSets.updateColorInputDescSet(1, colorAttachments[1]->GetImageView());
|
||||
|
||||
// Bind vertex and index buffers
|
||||
const vk::DeviceSize zeroOffset[] = { 0 };
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &mainBuffer, zeroOffset);
|
||||
cmdBuffer.bindVertexBuffers(0, mainBuffer, {0});
|
||||
cmdBuffer.bindIndexBuffer(mainBuffer, offsets.indexOffset, vk::IndexType::eUint32);
|
||||
|
||||
// Make sure to push constants even if not used
|
||||
|
@ -338,7 +336,7 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture)
|
|||
targetFramebuffer = GetFinalFramebuffer();
|
||||
cmdBuffer.beginRenderPass(
|
||||
vk::RenderPassBeginInfo(pipelineManager->GetRenderPass(initialPass, finalPass),
|
||||
targetFramebuffer, viewport, clear_colors.size(), clear_colors.data()),
|
||||
targetFramebuffer, viewport, clear_colors),
|
||||
vk::SubpassContents::eInline);
|
||||
|
||||
if (!pvrrc.isRTT && (FB_R_CTRL.fb_enable == 0 || VO_CONTROL.blank_video == 1))
|
||||
|
@ -394,7 +392,7 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture)
|
|||
|
||||
vk::MemoryBarrier memoryBarrier(vk::AccessFlagBits::eShaderWrite, vk::AccessFlagBits::eShaderRead);
|
||||
cmdBuffer.pipelineBarrier(vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eFragmentShader,
|
||||
vk::DependencyFlagBits::eByRegion, 1, &memoryBarrier, 0, nullptr, 0, nullptr);
|
||||
vk::DependencyFlagBits::eByRegion, memoryBarrier, nullptr, nullptr);
|
||||
firstFrameAfterInit = false;
|
||||
}
|
||||
// Tr modifier volumes
|
||||
|
@ -414,7 +412,7 @@ bool OITDrawer::Draw(const Texture *fogTexture, const Texture *paletteTexture)
|
|||
if (!finalPass)
|
||||
{
|
||||
// Re-bind vertex and index buffers
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &mainBuffer, zeroOffset);
|
||||
cmdBuffer.bindVertexBuffers(0, mainBuffer, {0});
|
||||
cmdBuffer.bindIndexBuffer(mainBuffer, offsets.indexOffset, vk::IndexType::eUint32);
|
||||
|
||||
// Tr depth-only pass
|
||||
|
@ -458,14 +456,14 @@ void OITDrawer::MakeBuffers(int width, int height)
|
|||
}
|
||||
needDepthTransition = true;
|
||||
|
||||
vk::ImageView attachments[] = {
|
||||
std::array<vk::ImageView, 4> attachments = {
|
||||
colorAttachments[1]->GetImageView(),
|
||||
colorAttachments[0]->GetImageView(),
|
||||
depthAttachments[0]->GetImageView(),
|
||||
depthAttachments[1]->GetImageView(),
|
||||
};
|
||||
vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), pipelineManager->GetRenderPass(true, true),
|
||||
ARRAY_SIZE(attachments), attachments, maxWidth, maxHeight, 1);
|
||||
attachments, maxWidth, maxHeight, 1);
|
||||
tempFramebuffers[0] = GetContext()->GetDevice().createFramebufferUnique(createInfo);
|
||||
attachments[0] = attachments[1];
|
||||
attachments[1] = colorAttachments[1]->GetImageView();
|
||||
|
@ -489,14 +487,14 @@ void OITScreenDrawer::MakeFramebuffers(const vk::Extent2D& viewport)
|
|||
new FramebufferAttachment(GetContext()->GetPhysicalDevice(), GetContext()->GetDevice())));
|
||||
finalColorAttachments.back()->Init(viewport.width, viewport.height, GetContext()->GetColorFormat(),
|
||||
vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eSampled);
|
||||
vk::ImageView attachments[] = {
|
||||
std::array<vk::ImageView, 4> attachments = {
|
||||
finalColorAttachments.back()->GetImageView(),
|
||||
colorAttachments[0]->GetImageView(),
|
||||
depthAttachments[0]->GetImageView(),
|
||||
depthAttachments[1]->GetImageView(),
|
||||
};
|
||||
vk::FramebufferCreateInfo createInfo(vk::FramebufferCreateFlags(), screenPipelineManager->GetRenderPass(true, true),
|
||||
ARRAY_SIZE(attachments), attachments, viewport.width, viewport.height, 1);
|
||||
attachments, viewport.width, viewport.height, 1);
|
||||
framebuffers.push_back(GetContext()->GetDevice().createFramebufferUnique(createInfo));
|
||||
transitionNeeded.push_back(true);
|
||||
clearNeeded.push_back(true);
|
||||
|
@ -582,7 +580,7 @@ vk::CommandBuffer OITTextureDrawer::NewFrame()
|
|||
|
||||
setImageLayout(commandBuffer, colorImage, vk::Format::eR8G8B8A8Unorm, 1, colorImageCurrentLayout, vk::ImageLayout::eColorAttachmentOptimal);
|
||||
|
||||
vk::ImageView imageViews[] = {
|
||||
std::array<vk::ImageView, 4> imageViews = {
|
||||
colorImageView,
|
||||
colorAttachments[0]->GetImageView(),
|
||||
depthAttachments[0]->GetImageView(),
|
||||
|
@ -590,7 +588,7 @@ vk::CommandBuffer OITTextureDrawer::NewFrame()
|
|||
};
|
||||
framebuffers.resize(GetSwapChainSize());
|
||||
framebuffers[GetCurrentImage()] = device.createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(),
|
||||
rttPipelineManager->GetRenderPass(true, true), ARRAY_SIZE(imageViews), imageViews, widthPow2, heightPow2, 1));
|
||||
rttPipelineManager->GetRenderPass(true, true), imageViews, widthPow2, heightPow2, 1));
|
||||
|
||||
commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, (float)upscaledWidth, (float)upscaledHeight, 1.0f, 0.0f));
|
||||
u32 minX = pvrrc.fb_X_CLIP.min;
|
||||
|
@ -638,7 +636,7 @@ void OITTextureDrawer::EndFrame()
|
|||
if (config::RenderToTextureBuffer)
|
||||
{
|
||||
vk::Fence fence = commandPool->GetCurrentFence();
|
||||
GetContext()->GetDevice().waitForFences(1, &fence, true, UINT64_MAX);
|
||||
GetContext()->GetDevice().waitForFences(fence, true, UINT64_MAX);
|
||||
|
||||
u16 *dst = (u16 *)&vram[textureAddr];
|
||||
|
||||
|
|
|
@ -131,8 +131,7 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
|
@ -161,15 +160,14 @@ void OITPipelineManager::CreatePipeline(u32 listType, bool autosort, const PolyP
|
|||
params.divPosZ = divPosZ;
|
||||
vk::ShaderModule fragment_module = shaderManager->GetFragmentShader(params);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -237,26 +235,24 @@ void OITPipelineManager::CreateFinalPipeline()
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), 2, dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
vk::ShaderModule vertex_module = shaderManager->GetFinalVertexShader();
|
||||
vk::ShaderModule fragment_module = shaderManager->GetFinalShader();
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -312,26 +308,24 @@ void OITPipelineManager::CreateClearPipeline()
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), 2, dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
vk::ShaderModule vertex_module = shaderManager->GetFinalVertexShader();
|
||||
vk::ShaderModule fragment_module = shaderManager->GetClearShader();
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -353,21 +347,13 @@ void OITPipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, boo
|
|||
{
|
||||
verify(mode != ModVolMode::Final);
|
||||
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescriptions[] =
|
||||
{
|
||||
{ 0, sizeof(float) * 3 },
|
||||
};
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescriptions[] =
|
||||
{
|
||||
vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, 0), // pos
|
||||
};
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescription(0, sizeof(float) * 3);
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, 0); // pos
|
||||
// Vertex input state
|
||||
vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo(
|
||||
vk::PipelineVertexInputStateCreateFlags(),
|
||||
ARRAY_SIZE(vertexBindingDescriptions),
|
||||
vertexBindingDescriptions,
|
||||
ARRAY_SIZE(vertexInputAttributeDescriptions),
|
||||
vertexInputAttributeDescriptions);
|
||||
vertexBindingDescription,
|
||||
vertexInputAttributeDescription);
|
||||
// Input assembly state
|
||||
vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo(vk::PipelineInputAssemblyStateCreateFlags(),
|
||||
vk::PrimitiveTopology::eTriangleList);
|
||||
|
@ -433,26 +419,24 @@ void OITPipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, boo
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), 2, dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
vk::ShaderModule vertex_module = shaderManager->GetModVolVertexShader(OITShaderManager::ModVolShaderParams{ naomi2, !settings.platform.isNaomi2() && config::NativeDepthInterpolation });
|
||||
vk::ShaderModule fragment_module = shaderManager->GetModVolShader(!settings.platform.isNaomi2() && config::NativeDepthInterpolation);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -463,8 +447,7 @@ void OITPipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, boo
|
|||
&pipelineColorBlendStateCreateInfo, // pColorBlendState
|
||||
&pipelineDynamicStateCreateInfo, // pDynamicState
|
||||
*pipelineLayout, // layout
|
||||
renderPasses->GetRenderPass(true, true), // renderPass
|
||||
0 // subpass
|
||||
renderPasses->GetRenderPass(true, true) // renderPass
|
||||
);
|
||||
|
||||
modVolPipelines[hash(mode, cullMode, naomi2)] =
|
||||
|
@ -476,21 +459,13 @@ void OITPipelineManager::CreateTrModVolPipeline(ModVolMode mode, int cullMode, b
|
|||
{
|
||||
verify(mode != ModVolMode::Final);
|
||||
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescriptions[] =
|
||||
{
|
||||
{ 0, sizeof(float) * 3 },
|
||||
};
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescriptions[] =
|
||||
{
|
||||
vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, 0), // pos
|
||||
};
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescription(0, sizeof(float) * 3);
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, 0); // pos
|
||||
// Vertex input state
|
||||
vk::PipelineVertexInputStateCreateInfo pipelineVertexInputStateCreateInfo(
|
||||
vk::PipelineVertexInputStateCreateFlags(),
|
||||
ARRAY_SIZE(vertexBindingDescriptions),
|
||||
vertexBindingDescriptions,
|
||||
ARRAY_SIZE(vertexInputAttributeDescriptions),
|
||||
vertexInputAttributeDescriptions);
|
||||
vertexBindingDescription,
|
||||
vertexInputAttributeDescription);
|
||||
// Input assembly state
|
||||
vk::PipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo(vk::PipelineInputAssemblyStateCreateFlags(),
|
||||
vk::PrimitiveTopology::eTriangleList);
|
||||
|
@ -528,27 +503,25 @@ void OITPipelineManager::CreateTrModVolPipeline(ModVolMode mode, int cullMode, b
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), 2, dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
bool divPosZ = !settings.platform.isNaomi2() && config::NativeDepthInterpolation;
|
||||
vk::ShaderModule vertex_module = shaderManager->GetModVolVertexShader(OITShaderManager::ModVolShaderParams{ naomi2, divPosZ });
|
||||
vk::ShaderModule fragment_module = shaderManager->GetTrModVolShader(OITShaderManager::TrModVolShaderParams{ mode, divPosZ });
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
|
|
@ -102,8 +102,8 @@ public:
|
|||
bufferInfos.emplace_back(buffer, fragmentUniformOffset, sizeof(FragmentShaderUniforms));
|
||||
|
||||
std::vector<vk::WriteDescriptorSet> writeDescriptorSets;
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 0, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &bufferInfos[0], nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 1, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &bufferInfos[1], nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 0, 0, vk::DescriptorType::eUniformBuffer, nullptr, bufferInfos[0]);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 1, 0, vk::DescriptorType::eUniformBuffer, nullptr, bufferInfos[1]);
|
||||
if (fogImageView)
|
||||
{
|
||||
TSP fogTsp = {};
|
||||
|
@ -113,7 +113,7 @@ public:
|
|||
vk::Sampler fogSampler = samplerManager->GetSampler(fogTsp);
|
||||
static vk::DescriptorImageInfo imageInfo;
|
||||
imageInfo = { fogSampler, fogImageView, vk::ImageLayout::eShaderReadOnlyOptimal };
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 2, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 2, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
}
|
||||
if (paletteImageView)
|
||||
{
|
||||
|
@ -124,18 +124,18 @@ public:
|
|||
vk::Sampler palSampler = samplerManager->GetSampler(palTsp);
|
||||
static vk::DescriptorImageInfo imageInfo;
|
||||
imageInfo = { palSampler, paletteImageView, vk::ImageLayout::eShaderReadOnlyOptimal };
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 6, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 6, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
}
|
||||
if (polyParamsSize > 0)
|
||||
{
|
||||
static vk::DescriptorBufferInfo polyParamsBufferInfo;
|
||||
polyParamsBufferInfo = vk::DescriptorBufferInfo(buffer, polyParamsOffset, polyParamsSize);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 3, 0, 1, vk::DescriptorType::eStorageBuffer, nullptr, &polyParamsBufferInfo, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 3, 0, vk::DescriptorType::eStorageBuffer, nullptr, polyParamsBufferInfo);
|
||||
}
|
||||
vk::DescriptorImageInfo stencilImageInfo(vk::Sampler(), stencilImageView, vk::ImageLayout::eDepthStencilReadOnlyOptimal);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 4, 0, 1, vk::DescriptorType::eInputAttachment, &stencilImageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 4, 0, vk::DescriptorType::eInputAttachment, stencilImageInfo);
|
||||
vk::DescriptorImageInfo depthImageInfo(vk::Sampler(), depthImageView, vk::ImageLayout::eDepthStencilReadOnlyOptimal);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 5, 0, 1, vk::DescriptorType::eInputAttachment, &depthImageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 5, 0, vk::DescriptorType::eInputAttachment, depthImageInfo);
|
||||
oitBuffers->updateDescriptorSet(perFrameDescSet, writeDescriptorSets);
|
||||
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
|
||||
|
@ -147,9 +147,9 @@ public:
|
|||
colorInputDescSets[index] = colorInputAlloc.alloc();
|
||||
|
||||
vk::DescriptorImageInfo colorImageInfo(vk::Sampler(), colorImageView, vk::ImageLayout::eShaderReadOnlyOptimal);
|
||||
vk::WriteDescriptorSet writeDescriptorSet(colorInputDescSets[index], 0, 0, 1, vk::DescriptorType::eInputAttachment, &colorImageInfo, nullptr, nullptr);
|
||||
vk::WriteDescriptorSet writeDescriptorSet(colorInputDescSets[index], 0, 0, vk::DescriptorType::eInputAttachment, colorImageInfo);
|
||||
|
||||
getContext()->GetDevice().updateDescriptorSets(1, &writeDescriptorSet, 0, nullptr);
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSet, nullptr);
|
||||
}
|
||||
|
||||
void bindPerPolyDescriptorSets(vk::CommandBuffer cmdBuffer, const PolyParam& poly, int polyNumber, vk::Buffer buffer,
|
||||
|
@ -167,14 +167,14 @@ public:
|
|||
{
|
||||
imageInfo0 = vk::DescriptorImageInfo{ samplerManager->GetSampler(poly.tsp), ((Texture *)poly.texture)->GetReadOnlyImageView(),
|
||||
vk::ImageLayout::eShaderReadOnlyOptimal };
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 0, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo0, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo0);
|
||||
}
|
||||
vk::DescriptorImageInfo imageInfo1;
|
||||
if (poly.texture1 != nullptr)
|
||||
{
|
||||
imageInfo1 = vk::DescriptorImageInfo{ samplerManager->GetSampler(poly.tsp1), ((Texture *)poly.texture1)->GetReadOnlyImageView(),
|
||||
vk::ImageLayout::eShaderReadOnlyOptimal };
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 1, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo1, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 1, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo1);
|
||||
}
|
||||
|
||||
vk::DescriptorBufferInfo uniBufferInfo;
|
||||
|
@ -184,7 +184,7 @@ public:
|
|||
const vk::DeviceSize uniformAlignment = VulkanContext::Instance()->GetUniformBufferAlignment();
|
||||
size_t size = sizeof(N2VertexShaderUniforms) + align(sizeof(N2VertexShaderUniforms), uniformAlignment);
|
||||
uniBufferInfo = vk::DescriptorBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) };
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, vk::DescriptorType::eUniformBuffer, nullptr, uniBufferInfo);
|
||||
|
||||
size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment);
|
||||
// light at index 0 is no light
|
||||
|
@ -192,7 +192,7 @@ public:
|
|||
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head() + 1) * size, sizeof(N2LightModel) };
|
||||
else
|
||||
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset, sizeof(N2LightModel) };
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &lightBufferInfo, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, vk::DescriptorType::eUniformBuffer, nullptr, lightBufferInfo);
|
||||
}
|
||||
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
|
||||
|
@ -200,7 +200,7 @@ public:
|
|||
}
|
||||
else
|
||||
perPolyDescSet = it->second;
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, 1, &perPolyDescSet, 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, perPolyDescSet, nullptr);
|
||||
}
|
||||
|
||||
void bindPerPolyDescriptorSets(vk::CommandBuffer cmdBuffer, const ModifierVolumeParam& mvParam, int polyNumber, vk::Buffer buffer, vk::DeviceSize uniformOffset)
|
||||
|
@ -216,24 +216,24 @@ public:
|
|||
const vk::DeviceSize uniformAlignment = VulkanContext::Instance()->GetUniformBufferAlignment();
|
||||
size_t size = sizeof(N2VertexShaderUniforms) + align(sizeof(N2VertexShaderUniforms), uniformAlignment);
|
||||
vk::DescriptorBufferInfo uniBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) };
|
||||
vk::WriteDescriptorSet writeDescriptorSet(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr);
|
||||
vk::WriteDescriptorSet writeDescriptorSet(perPolyDescSet, 2, 0, vk::DescriptorType::eUniformBuffer, nullptr, uniBufferInfo);
|
||||
|
||||
getContext()->GetDevice().updateDescriptorSets(1, &writeDescriptorSet, 0, nullptr);
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSet, nullptr);
|
||||
perPolyDescSets[&mvParam] = perPolyDescSet;
|
||||
}
|
||||
else
|
||||
perPolyDescSet = it->second;
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, 1, &perPolyDescSet, 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, perPolyDescSet, nullptr);
|
||||
}
|
||||
|
||||
void bindPerFrameDescriptorSets(vk::CommandBuffer cmdBuffer)
|
||||
{
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, 1, &perFrameDescSet, 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, perFrameDescSet, nullptr);
|
||||
}
|
||||
|
||||
void bindColorInputDescSet(vk::CommandBuffer cmdBuffer, int index)
|
||||
{
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 2, 1, &colorInputDescSets[index], 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 2, colorInputDescSets[index], nullptr);
|
||||
}
|
||||
|
||||
void nextFrame()
|
||||
|
@ -283,45 +283,43 @@ public:
|
|||
{
|
||||
vk::Device device = GetContext()->GetDevice();
|
||||
// Descriptor set and pipeline layout
|
||||
vk::DescriptorSetLayoutBinding perFrameBindings[] = {
|
||||
{ 0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex }, // vertex uniforms
|
||||
{ 1, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eFragment }, // fragment uniforms
|
||||
{ 2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment },// fog texture
|
||||
{ 3, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment }, // Tr poly params
|
||||
{ 4, vk::DescriptorType::eInputAttachment, 1, vk::ShaderStageFlagBits::eFragment }, // stencil input attachment
|
||||
{ 5, vk::DescriptorType::eInputAttachment, 1, vk::ShaderStageFlagBits::eFragment }, // depth input attachment
|
||||
{ 6, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment },// palette texture
|
||||
std::array<vk::DescriptorSetLayoutBinding, 10> perFrameBindings = {
|
||||
vk::DescriptorSetLayoutBinding(0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex), // vertex uniforms
|
||||
vk::DescriptorSetLayoutBinding(1, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eFragment), // fragment uniforms
|
||||
vk::DescriptorSetLayoutBinding(2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment),// fog texture
|
||||
vk::DescriptorSetLayoutBinding(3, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment), // Tr poly params
|
||||
vk::DescriptorSetLayoutBinding(4, vk::DescriptorType::eInputAttachment, 1, vk::ShaderStageFlagBits::eFragment), // stencil input attachment
|
||||
vk::DescriptorSetLayoutBinding(5, vk::DescriptorType::eInputAttachment, 1, vk::ShaderStageFlagBits::eFragment), // depth input attachment
|
||||
vk::DescriptorSetLayoutBinding(6, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment),// palette texture
|
||||
// OIT buffers
|
||||
{ 7, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment }, // pixel buffer
|
||||
{ 8, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment }, // pixel counter
|
||||
{ 9, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment }, // a-buffer pointers
|
||||
vk::DescriptorSetLayoutBinding(7, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment), // pixel buffer
|
||||
vk::DescriptorSetLayoutBinding(8, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment), // pixel counter
|
||||
vk::DescriptorSetLayoutBinding(9, vk::DescriptorType::eStorageBuffer, 1, vk::ShaderStageFlagBits::eFragment), // a-buffer pointers
|
||||
};
|
||||
perFrameLayout = device.createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(perFrameBindings), perFrameBindings));
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), perFrameBindings));
|
||||
|
||||
vk::DescriptorSetLayoutBinding colorInputBindings[] = {
|
||||
{ 0, vk::DescriptorType::eInputAttachment, 1, vk::ShaderStageFlagBits::eFragment }, // color input attachment
|
||||
};
|
||||
vk::DescriptorSetLayoutBinding colorInputBinding(0, vk::DescriptorType::eInputAttachment, 1, vk::ShaderStageFlagBits::eFragment); // color input attachment
|
||||
colorInputLayout = device.createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(colorInputBindings), colorInputBindings));
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), colorInputBinding));
|
||||
|
||||
vk::DescriptorSetLayoutBinding perPolyBindings[] = {
|
||||
{ 0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment }, // texture 0
|
||||
{ 1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment }, // texture 1 (for 2-volume mode)
|
||||
{ 2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex }, // Naomi2 uniforms
|
||||
{ 3, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex }, // Naomi2 lights
|
||||
std::array<vk::DescriptorSetLayoutBinding, 4> perPolyBindings = {
|
||||
vk::DescriptorSetLayoutBinding(0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment), // texture 0
|
||||
vk::DescriptorSetLayoutBinding(1, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment), // texture 1 (for 2-volume mode)
|
||||
vk::DescriptorSetLayoutBinding(2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex), // Naomi2 uniforms
|
||||
vk::DescriptorSetLayoutBinding(3, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex), // Naomi2 lights
|
||||
};
|
||||
perPolyLayout = device.createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(perPolyBindings), perPolyBindings));
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), perPolyBindings));
|
||||
|
||||
vk::PushConstantRange pushConstants[] = {
|
||||
std::array<vk::PushConstantRange, 2> pushConstants = {
|
||||
vk::PushConstantRange(vk::ShaderStageFlagBits::eFragment, 0, sizeof(OITDescriptorSets::PushConstants)),
|
||||
vk::PushConstantRange(vk::ShaderStageFlagBits::eVertex, sizeof(OITDescriptorSets::PushConstants), sizeof(OITDescriptorSets::VtxPushConstants)),
|
||||
};
|
||||
|
||||
vk::DescriptorSetLayout layouts[] = { *perFrameLayout, *perPolyLayout, *colorInputLayout };
|
||||
std::array<vk::DescriptorSetLayout, 3> layouts = { *perFrameLayout, *perPolyLayout, *colorInputLayout };
|
||||
pipelineLayout = device.createPipelineLayoutUnique(
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), ARRAY_SIZE(layouts), layouts, ARRAY_SIZE(pushConstants), pushConstants));
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), layouts, pushConstants));
|
||||
}
|
||||
|
||||
pipelines.clear();
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last)
|
||||
{
|
||||
vk::AttachmentDescription attachmentDescriptions[] = {
|
||||
std::array<vk::AttachmentDescription, 4> attachmentDescriptions = {
|
||||
// Swap chain image
|
||||
GetAttachment0Description(initial, last),
|
||||
// OP+PT color attachment
|
||||
|
@ -52,23 +52,23 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last)
|
|||
vk::AttachmentReference depthReference2(3, vk::ImageLayout::eDepthStencilAttachmentOptimal);
|
||||
vk::AttachmentReference colorInput(1, vk::ImageLayout::eShaderReadOnlyOptimal);
|
||||
|
||||
vk::SubpassDescription subpasses[] = {
|
||||
std::array<vk::SubpassDescription, 3> subpasses = {
|
||||
// Depth and modvol pass FIXME subpass 0 shouldn't reference the color attachment
|
||||
vk::SubpassDescription(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics,
|
||||
0, nullptr,
|
||||
1, &colorReference,
|
||||
nullptr,
|
||||
colorReference,
|
||||
nullptr,
|
||||
&depthReference),
|
||||
// Color pass
|
||||
vk::SubpassDescription(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics,
|
||||
1, &depthReadOnlyRef,
|
||||
1, &colorReference,
|
||||
depthReadOnlyRef,
|
||||
colorReference,
|
||||
nullptr,
|
||||
&depthReference2),
|
||||
// Final pass
|
||||
vk::SubpassDescription(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics,
|
||||
1, &colorInput,
|
||||
1, &swapChainReference,
|
||||
colorInput,
|
||||
swapChainReference,
|
||||
nullptr,
|
||||
&depthReference2), // depth-only Tr pass when continuation
|
||||
};
|
||||
|
@ -99,8 +99,8 @@ vk::UniqueRenderPass RenderPasses::MakeRenderPass(bool initial, bool last)
|
|||
vk::DependencyFlagBits::eByRegion);
|
||||
|
||||
return GetContext()->GetDevice().createRenderPassUnique(vk::RenderPassCreateInfo(vk::RenderPassCreateFlags(),
|
||||
ARRAY_SIZE(attachmentDescriptions), attachmentDescriptions,
|
||||
ARRAY_SIZE(subpasses), subpasses,
|
||||
dependencies.size(), dependencies.data()));
|
||||
attachmentDescriptions,
|
||||
subpasses,
|
||||
dependencies));
|
||||
}
|
||||
|
||||
|
|
|
@ -188,7 +188,7 @@ void VulkanOverlay::Draw(vk::CommandBuffer commandBuffer, vk::Extent2D viewport,
|
|||
}
|
||||
#endif
|
||||
vk::Viewport viewport(x, y, w, h);
|
||||
commandBuffer.setViewport(0, 1, &viewport);
|
||||
commandBuffer.setViewport(0, viewport);
|
||||
commandBuffer.setScissor(0, vk::Rect2D(vk::Offset2D(x, y), vk::Extent2D(w, h)));
|
||||
|
||||
drawers[i]->Draw(commandBuffer, vmuTextures[i]->GetImageView(), vtx, true, color);
|
||||
|
@ -219,7 +219,7 @@ void VulkanOverlay::Draw(vk::CommandBuffer commandBuffer, vk::Extent2D viewport,
|
|||
x -= w / 2;
|
||||
y -= h / 2;
|
||||
vk::Viewport viewport(x, y, w, h);
|
||||
commandBuffer.setViewport(0, 1, &viewport);
|
||||
commandBuffer.setViewport(0, viewport);
|
||||
commandBuffer.setScissor(0, vk::Rect2D(vk::Offset2D(std::max(0.f, x), std::max(0.f, y)),
|
||||
vk::Extent2D(w, h)));
|
||||
u32 color = config::CrosshairColor[i];
|
||||
|
|
|
@ -38,20 +38,12 @@ void PipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, bool n
|
|||
}
|
||||
else
|
||||
{
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescriptions[] =
|
||||
{
|
||||
{ 0, sizeof(float) * 3 },
|
||||
};
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescriptions[] =
|
||||
{
|
||||
vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, 0), // pos
|
||||
};
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescription(0, sizeof(float) * 3);
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescription(0, 0, vk::Format::eR32G32B32Sfloat, 0); // pos
|
||||
pipelineVertexInputStateCreateInfo = vk::PipelineVertexInputStateCreateInfo(
|
||||
vk::PipelineVertexInputStateCreateFlags(),
|
||||
ARRAY_SIZE(vertexBindingDescriptions),
|
||||
vertexBindingDescriptions,
|
||||
ARRAY_SIZE(vertexInputAttributeDescriptions),
|
||||
vertexInputAttributeDescriptions);
|
||||
vertexBindingDescription,
|
||||
vertexInputAttributeDescription);
|
||||
pipelineInputAssemblyStateCreateInfo = vk::PipelineInputAssemblyStateCreateInfo(vk::PipelineInputAssemblyStateCreateFlags(),
|
||||
vk::PrimitiveTopology::eTriangleList);
|
||||
}
|
||||
|
@ -130,27 +122,25 @@ void PipelineManager::CreateModVolPipeline(ModVolMode mode, int cullMode, bool n
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), 2, dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
ModVolShaderParams shaderParams { naomi2, !settings.platform.isNaomi2() && config::NativeDepthInterpolation };
|
||||
vk::ShaderModule vertex_module = shaderManager->GetModVolVertexShader(shaderParams);
|
||||
vk::ShaderModule fragment_module = shaderManager->GetModVolShader(!settings.platform.isNaomi2() && config::NativeDepthInterpolation);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -234,27 +224,25 @@ void PipelineManager::CreateDepthPassPipeline(int cullMode, bool naomi2)
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[2] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), 2, dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
ModVolShaderParams shaderParams { naomi2, !settings.platform.isNaomi2() && config::NativeDepthInterpolation };
|
||||
vk::ShaderModule vertex_module = shaderManager->GetModVolVertexShader(shaderParams);
|
||||
vk::ShaderModule fragment_module = shaderManager->GetModVolShader(!settings.platform.isNaomi2() && config::NativeDepthInterpolation);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -386,8 +374,7 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
|
@ -413,15 +400,14 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol
|
|||
params.divPosZ = divPosZ;
|
||||
vk::ShaderModule fragment_module = shaderManager->GetFragmentShader(params);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, vertex_module, "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, fragment_module, "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -442,21 +428,15 @@ void PipelineManager::CreatePipeline(u32 listType, bool sortTriangles, const Pol
|
|||
void OSDPipeline::CreatePipeline()
|
||||
{
|
||||
// Vertex input state
|
||||
static const vk::VertexInputBindingDescription vertexBindingDescriptions[] =
|
||||
{
|
||||
{ 0, sizeof(OSDVertex) },
|
||||
};
|
||||
static const vk::VertexInputAttributeDescription vertexInputAttributeDescriptions[] =
|
||||
{
|
||||
static const vk::VertexInputBindingDescription vertexInputBindingDescription(0, sizeof(OSDVertex));
|
||||
static const std::array<vk::VertexInputAttributeDescription, 3> vertexInputAttributeDescriptions = {
|
||||
vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32Sfloat, offsetof(OSDVertex, x)), // pos
|
||||
vk::VertexInputAttributeDescription(1, 0, vk::Format::eR8G8B8A8Uint, offsetof(OSDVertex, r)), // color
|
||||
vk::VertexInputAttributeDescription(2, 0, vk::Format::eR32G32Sfloat, offsetof(OSDVertex, u)), // tex coord
|
||||
};
|
||||
vk::PipelineVertexInputStateCreateInfo vertexInputStateCreateInfo(
|
||||
vk::PipelineVertexInputStateCreateFlags(),
|
||||
ARRAY_SIZE(vertexBindingDescriptions),
|
||||
vertexBindingDescriptions,
|
||||
ARRAY_SIZE(vertexInputAttributeDescriptions),
|
||||
vertexInputBindingDescription,
|
||||
vertexInputAttributeDescriptions);
|
||||
|
||||
// Input assembly state
|
||||
|
@ -490,24 +470,21 @@ void OSDPipeline::CreatePipeline()
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), ARRAY_SIZE(dynamicStates),
|
||||
dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, shaderManager->GetOSDVertexShader(), "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, shaderManager->GetOSDFragmentShader(), "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, shaderManager->GetOSDVertexShader(), "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, shaderManager->GetOSDFragmentShader(), "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&vertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -518,8 +495,7 @@ void OSDPipeline::CreatePipeline()
|
|||
&pipelineColorBlendStateCreateInfo, // pColorBlendState
|
||||
&pipelineDynamicStateCreateInfo, // pDynamicState
|
||||
*pipelineLayout, // layout
|
||||
renderPass, // renderPass
|
||||
0 // subpass
|
||||
renderPass // renderPass
|
||||
);
|
||||
|
||||
pipeline = GetContext()->GetDevice().createGraphicsPipelineUnique(GetContext()->GetPipelineCache(), graphicsPipelineCreateInfo).value;
|
||||
|
|
|
@ -49,8 +49,8 @@ public:
|
|||
bufferInfos.emplace_back(buffer, fragmentUniformOffset, sizeof(FragmentShaderUniforms));
|
||||
|
||||
std::vector<vk::WriteDescriptorSet> writeDescriptorSets;
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 0, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &bufferInfos[0], nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 1, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &bufferInfos[1], nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 0, 0, vk::DescriptorType::eUniformBuffer, nullptr, bufferInfos[0]);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 1, 0, vk::DescriptorType::eUniformBuffer, nullptr, bufferInfos[1]);
|
||||
if (fogImageView)
|
||||
{
|
||||
TSP fogTsp = {};
|
||||
|
@ -60,7 +60,7 @@ public:
|
|||
vk::Sampler fogSampler = samplerManager->GetSampler(fogTsp);
|
||||
static vk::DescriptorImageInfo imageInfo;
|
||||
imageInfo = { fogSampler, fogImageView, vk::ImageLayout::eShaderReadOnlyOptimal };
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 2, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 2, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
}
|
||||
if (paletteImageView)
|
||||
{
|
||||
|
@ -71,7 +71,7 @@ public:
|
|||
vk::Sampler palSampler = samplerManager->GetSampler(palTsp);
|
||||
static vk::DescriptorImageInfo imageInfo;
|
||||
imageInfo = { palSampler, paletteImageView, vk::ImageLayout::eShaderReadOnlyOptimal };
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 3, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perFrameDescSet, 3, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
}
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ public:
|
|||
{
|
||||
imageInfo = vk::DescriptorImageInfo(samplerManager->GetSampler(poly.tsp),
|
||||
((Texture *)poly.texture)->GetReadOnlyImageView(), vk::ImageLayout::eShaderReadOnlyOptimal);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 0, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
}
|
||||
|
||||
vk::DescriptorBufferInfo uniBufferInfo;
|
||||
|
@ -101,7 +101,7 @@ public:
|
|||
const vk::DeviceSize uniformAlignment = VulkanContext::Instance()->GetUniformBufferAlignment();
|
||||
size_t size = sizeof(N2VertexShaderUniforms) + align(sizeof(N2VertexShaderUniforms), uniformAlignment);
|
||||
uniBufferInfo = vk::DescriptorBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) };
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, vk::DescriptorType::eUniformBuffer, nullptr, uniBufferInfo);
|
||||
|
||||
size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment);
|
||||
// light at index 0 is no light
|
||||
|
@ -109,7 +109,7 @@ public:
|
|||
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head() + 1) * size, sizeof(N2LightModel) };
|
||||
else
|
||||
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset, sizeof(N2LightModel) };
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &lightBufferInfo, nullptr);
|
||||
writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, vk::DescriptorType::eUniformBuffer, nullptr, lightBufferInfo);
|
||||
}
|
||||
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
|
||||
|
@ -117,7 +117,7 @@ public:
|
|||
}
|
||||
else
|
||||
perPolyDescSet = it->second;
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, 1, &perPolyDescSet, 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, perPolyDescSet, nullptr);
|
||||
}
|
||||
|
||||
void bindPerPolyDescriptorSets(vk::CommandBuffer cmdBuffer, const ModifierVolumeParam& mvParam, int polyNumber, vk::Buffer buffer,
|
||||
|
@ -134,19 +134,19 @@ public:
|
|||
const vk::DeviceSize uniformAlignment = VulkanContext::Instance()->GetUniformBufferAlignment();
|
||||
size_t size = sizeof(N2VertexShaderUniforms) + align(sizeof(N2VertexShaderUniforms), uniformAlignment);
|
||||
vk::DescriptorBufferInfo uniBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) };
|
||||
vk::WriteDescriptorSet writeDescriptorSet(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr);
|
||||
vk::WriteDescriptorSet writeDescriptorSet(perPolyDescSet, 2, 0, vk::DescriptorType::eUniformBuffer, nullptr, uniBufferInfo);
|
||||
|
||||
getContext()->GetDevice().updateDescriptorSets(1, &writeDescriptorSet, 0, nullptr);
|
||||
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSet, nullptr);
|
||||
perPolyDescSets[&mvParam] = perPolyDescSet;
|
||||
}
|
||||
else
|
||||
perPolyDescSet = it->second;
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, 1, &perPolyDescSet, 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 1, perPolyDescSet, nullptr);
|
||||
}
|
||||
|
||||
void bindPerFrameDescriptorSets(vk::CommandBuffer cmdBuffer)
|
||||
{
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, 1, &perFrameDescSet, 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, perFrameDescSet, nullptr);
|
||||
}
|
||||
|
||||
void nextFrame()
|
||||
|
@ -187,25 +187,25 @@ public:
|
|||
if (!perFrameLayout)
|
||||
{
|
||||
// Descriptor set and pipeline layout
|
||||
vk::DescriptorSetLayoutBinding perFrameBindings[] = {
|
||||
{ 0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex }, // vertex uniforms
|
||||
{ 1, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eFragment }, // fragment uniforms
|
||||
{ 2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment },// fog texture
|
||||
{ 3, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment },// palette texture
|
||||
std::array<vk::DescriptorSetLayoutBinding, 4> perFrameBindings = {
|
||||
vk::DescriptorSetLayoutBinding(0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex), // vertex uniforms
|
||||
vk::DescriptorSetLayoutBinding(1, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eFragment), // fragment uniforms
|
||||
vk::DescriptorSetLayoutBinding(2, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment),// fog texture
|
||||
vk::DescriptorSetLayoutBinding(3, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment),// palette texture
|
||||
};
|
||||
vk::DescriptorSetLayoutBinding perPolyBindings[] = {
|
||||
{ 0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment },// texture
|
||||
{ 2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex }, // Naomi2 uniforms
|
||||
{ 3, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex }, // Naomi2 lights
|
||||
std::array<vk::DescriptorSetLayoutBinding, 3> perPolyBindings = {
|
||||
vk::DescriptorSetLayoutBinding(0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment),// texture
|
||||
vk::DescriptorSetLayoutBinding(2, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex), // Naomi2 uniforms
|
||||
vk::DescriptorSetLayoutBinding(3, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex), // Naomi2 lights
|
||||
};
|
||||
perFrameLayout = GetContext()->GetDevice().createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(perFrameBindings), perFrameBindings));
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), perFrameBindings));
|
||||
perPolyLayout = GetContext()->GetDevice().createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(perPolyBindings), perPolyBindings));
|
||||
vk::DescriptorSetLayout layouts[] = { *perFrameLayout, *perPolyLayout };
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), perPolyBindings));
|
||||
std::array<vk::DescriptorSetLayout, 2> layouts = { *perFrameLayout, *perPolyLayout };
|
||||
vk::PushConstantRange pushConstant(vk::ShaderStageFlagBits::eFragment, 0, 24);
|
||||
pipelineLayout = GetContext()->GetDevice().createPipelineLayoutUnique(
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), ARRAY_SIZE(layouts), layouts, 1, &pushConstant));
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), layouts, pushConstant));
|
||||
}
|
||||
|
||||
if (this->renderPass != renderPass)
|
||||
|
@ -350,7 +350,7 @@ public:
|
|||
};
|
||||
vk::AttachmentReference colorReference(0, vk::ImageLayout::eColorAttachmentOptimal);
|
||||
vk::AttachmentReference depthReference(1, vk::ImageLayout::eDepthStencilAttachmentOptimal);
|
||||
vk::SubpassDescription subpass(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics, 0, nullptr, 1, &colorReference, nullptr, &depthReference);
|
||||
vk::SubpassDescription subpass(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics, nullptr, colorReference, nullptr, &depthReference);
|
||||
vk::SubpassDependency dependencies[] {
|
||||
vk::SubpassDependency(VK_SUBPASS_EXTERNAL, 0, vk::PipelineStageFlagBits::eFragmentShader, vk::PipelineStageFlagBits::eColorAttachmentOutput,
|
||||
vk::AccessFlagBits::eShaderRead, vk::AccessFlagBits::eColorAttachmentWrite),
|
||||
|
@ -388,13 +388,11 @@ public:
|
|||
this->shaderManager = shaderManager;
|
||||
if (!pipelineLayout)
|
||||
{
|
||||
vk::DescriptorSetLayoutBinding bindings[] = {
|
||||
{ 0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment },// texture
|
||||
};
|
||||
vk::DescriptorSetLayoutBinding binding(0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment); // texture
|
||||
descSetLayout = GetContext()->GetDevice().createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(bindings), bindings));
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), binding));
|
||||
pipelineLayout = GetContext()->GetDevice().createPipelineLayoutUnique(
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), 1, &descSetLayout.get()));
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), descSetLayout.get()));
|
||||
}
|
||||
if (!sampler)
|
||||
{
|
||||
|
@ -412,12 +410,11 @@ public:
|
|||
if (!descriptorSet)
|
||||
{
|
||||
descriptorSet = std::move(GetContext()->GetDevice().allocateDescriptorSetsUnique(
|
||||
vk::DescriptorSetAllocateInfo(GetContext()->GetDescriptorPool(), 1, &descSetLayout.get())).front());
|
||||
vk::DescriptorSetAllocateInfo(GetContext()->GetDescriptorPool(), descSetLayout.get())).front());
|
||||
}
|
||||
vk::DescriptorImageInfo imageInfo(*sampler, imageView, vk::ImageLayout::eShaderReadOnlyOptimal);
|
||||
std::vector<vk::WriteDescriptorSet> writeDescriptorSets;
|
||||
writeDescriptorSets.emplace_back(*descriptorSet, 0, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
GetContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
|
||||
vk::WriteDescriptorSet writeDescriptorSet(*descriptorSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
GetContext()->GetDevice().updateDescriptorSets(writeDescriptorSet, nullptr);
|
||||
}
|
||||
|
||||
vk::Pipeline GetPipeline()
|
||||
|
@ -429,7 +426,7 @@ public:
|
|||
|
||||
void BindDescriptorSets(vk::CommandBuffer cmdBuffer) const
|
||||
{
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *pipelineLayout, 0, 1, &descriptorSet.get(), 0, nullptr);
|
||||
cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *pipelineLayout, 0, descriptorSet.get(), nullptr);
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -82,23 +82,21 @@ void QuadPipeline::CreatePipeline()
|
|||
vk::PipelineColorBlendStateCreateFlags(), // flags
|
||||
false, // logicOpEnable
|
||||
vk::LogicOp::eNoOp, // logicOp
|
||||
1, // attachmentCount
|
||||
&pipelineColorBlendAttachmentState, // pAttachments
|
||||
pipelineColorBlendAttachmentState, // attachments
|
||||
{ { 1.0f, 1.0f, 1.0f, 1.0f } } // blendConstants
|
||||
);
|
||||
|
||||
vk::DynamicState dynamicStates[] = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), ARRAY_SIZE(dynamicStates), dynamicStates);
|
||||
std::array<vk::DynamicState, 2> dynamicStates = { vk::DynamicState::eViewport, vk::DynamicState::eScissor };
|
||||
vk::PipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo(vk::PipelineDynamicStateCreateFlags(), dynamicStates);
|
||||
|
||||
vk::PipelineShaderStageCreateInfo stages[] = {
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, shaderManager->GetQuadVertexShader(rotate), "main" },
|
||||
{ vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, shaderManager->GetQuadFragmentShader(ignoreTexAlpha), "main" },
|
||||
std::array<vk::PipelineShaderStageCreateInfo, 2> stages = {
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eVertex, shaderManager->GetQuadVertexShader(rotate), "main"),
|
||||
vk::PipelineShaderStageCreateInfo(vk::PipelineShaderStageCreateFlags(), vk::ShaderStageFlagBits::eFragment, shaderManager->GetQuadFragmentShader(ignoreTexAlpha), "main"),
|
||||
};
|
||||
vk::GraphicsPipelineCreateInfo graphicsPipelineCreateInfo
|
||||
(
|
||||
vk::PipelineCreateFlags(), // flags
|
||||
2, // stageCount
|
||||
stages, // pStages
|
||||
stages, // stages
|
||||
&pipelineVertexInputStateCreateInfo, // pVertexInputState
|
||||
&pipelineInputAssemblyStateCreateInfo, // pInputAssemblyState
|
||||
nullptr, // pTessellationState
|
||||
|
@ -121,14 +119,12 @@ void QuadPipeline::Init(ShaderManager *shaderManager, vk::RenderPass renderPass,
|
|||
this->shaderManager = shaderManager;
|
||||
if (!pipelineLayout)
|
||||
{
|
||||
vk::DescriptorSetLayoutBinding bindings[] = {
|
||||
{ 0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment }, // texture
|
||||
};
|
||||
vk::DescriptorSetLayoutBinding binding(0, vk::DescriptorType::eCombinedImageSampler, 1, vk::ShaderStageFlagBits::eFragment); // texture
|
||||
descSetLayout = GetContext()->GetDevice().createDescriptorSetLayoutUnique(
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), ARRAY_SIZE(bindings), bindings));
|
||||
vk::DescriptorSetLayoutCreateInfo(vk::DescriptorSetLayoutCreateFlags(), binding));
|
||||
vk::PushConstantRange pushConstant(vk::ShaderStageFlagBits::eFragment, 0, 4 * sizeof(float));
|
||||
pipelineLayout = GetContext()->GetDevice().createPipelineLayoutUnique(
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), 1, &descSetLayout.get(), 1, &pushConstant));
|
||||
vk::PipelineLayoutCreateInfo(vk::PipelineLayoutCreateFlags(), descSetLayout.get(), pushConstant));
|
||||
}
|
||||
if (!linearSampler)
|
||||
{
|
||||
|
@ -179,16 +175,15 @@ void QuadDrawer::Draw(vk::CommandBuffer commandBuffer, vk::ImageView imageView,
|
|||
{
|
||||
vk::DescriptorSetLayout layout = pipeline->GetDescSetLayout();
|
||||
descSet = std::move(context->GetDevice().allocateDescriptorSetsUnique(
|
||||
vk::DescriptorSetAllocateInfo(context->GetDescriptorPool(), 1, &layout)).front());
|
||||
vk::DescriptorSetAllocateInfo(context->GetDescriptorPool(), layout)).front());
|
||||
}
|
||||
if (imageView)
|
||||
{
|
||||
vk::DescriptorImageInfo imageInfo(nearestFilter ? pipeline->GetNearestSampler() : pipeline->GetLinearSampler(), imageView, vk::ImageLayout::eShaderReadOnlyOptimal);
|
||||
std::vector<vk::WriteDescriptorSet> writeDescriptorSets;
|
||||
writeDescriptorSets.emplace_back(*descSet, 0, 0, 1, vk::DescriptorType::eCombinedImageSampler, &imageInfo, nullptr, nullptr);
|
||||
context->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
|
||||
vk::WriteDescriptorSet writeDescriptorSet(*descSet, 0, 0, vk::DescriptorType::eCombinedImageSampler, imageInfo);
|
||||
context->GetDevice().updateDescriptorSets(writeDescriptorSet, nullptr);
|
||||
}
|
||||
commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline->GetPipelineLayout(), 0, 1, &descSet.get(), 0, nullptr);
|
||||
commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline->GetPipelineLayout(), 0, descSet.get(), nullptr);
|
||||
|
||||
buffer->Update(vertices);
|
||||
buffer->Bind(commandBuffer);
|
||||
|
|
|
@ -43,8 +43,7 @@ public:
|
|||
|
||||
void Bind(vk::CommandBuffer commandBuffer)
|
||||
{
|
||||
const vk::DeviceSize zero = 0;
|
||||
commandBuffer.bindVertexBuffers(0, 1, &buffer->buffer.get(), &zero);
|
||||
commandBuffer.bindVertexBuffers(0, buffer->buffer.get(), {0});
|
||||
}
|
||||
void Draw(vk::CommandBuffer commandBuffer)
|
||||
{
|
||||
|
|
|
@ -234,7 +234,7 @@ void Texture::CreateImage(vk::ImageTiling tiling, const vk::ImageUsageFlags& usa
|
|||
{
|
||||
vk::ImageCreateInfo imageCreateInfo(vk::ImageCreateFlags(), vk::ImageType::e2D, format, vk::Extent3D(extent, 1), mipmapLevels, 1,
|
||||
vk::SampleCountFlagBits::e1, tiling, usage,
|
||||
vk::SharingMode::eExclusive, 0, nullptr, initialLayout);
|
||||
vk::SharingMode::eExclusive, nullptr, initialLayout);
|
||||
image = device.createImageUnique(imageCreateInfo);
|
||||
|
||||
VmaAllocationCreateInfo allocCreateInfo = { VmaAllocationCreateFlags(), needsStaging ? VmaMemoryUsage::VMA_MEMORY_USAGE_GPU_ONLY : VmaMemoryUsage::VMA_MEMORY_USAGE_CPU_TO_GPU };
|
||||
|
@ -283,7 +283,7 @@ void Texture::SetImage(u32 srcSize, const void *srcData, bool isNew, bool genMip
|
|||
}
|
||||
else if (!needsStaging)
|
||||
{
|
||||
vk::SubresourceLayout layout = device.getImageSubresourceLayout(*image, vk::ImageSubresource(vk::ImageAspectFlagBits::eColor, 0, 0));
|
||||
vk::SubresourceLayout layout = device.getImageSubresourceLayout(*image, vk::ImageSubresource(vk::ImageAspectFlagBits::eColor));
|
||||
if (layout.size != srcSize)
|
||||
{
|
||||
u8 *src = (u8 *)srcData;
|
||||
|
@ -376,7 +376,7 @@ void Texture::GenerateMipmaps()
|
|||
{ { vk::Offset3D(0, 0, 0), vk::Offset3D(mipWidth, mipHeight, 1) } },
|
||||
vk::ImageSubresourceLayers(vk::ImageAspectFlagBits::eColor, i, 0, 1),
|
||||
{ { vk::Offset3D(0, 0, 0), vk::Offset3D(std::max(mipWidth / 2, 1u), std::max(mipHeight / 2, 1u), 1) } });
|
||||
commandBuffer.blitImage(*image, vk::ImageLayout::eTransferSrcOptimal, *image, vk::ImageLayout::eTransferDstOptimal, 1, &blit, vk::Filter::eLinear);
|
||||
commandBuffer.blitImage(*image, vk::ImageLayout::eTransferSrcOptimal, *image, vk::ImageLayout::eTransferDstOptimal, blit, vk::Filter::eLinear);
|
||||
|
||||
// Transition previous mipmap level from src optimal to shader read-only optimal
|
||||
barrier.oldLayout = vk::ImageLayout::eTransferSrcOptimal;
|
||||
|
@ -410,7 +410,7 @@ void FramebufferAttachment::Init(u32 width, u32 height, vk::Format format, const
|
|||
}
|
||||
vk::ImageCreateInfo imageCreateInfo(vk::ImageCreateFlags(), vk::ImageType::e2D, format, vk::Extent3D(extent, 1), 1, 1, vk::SampleCountFlagBits::e1,
|
||||
vk::ImageTiling::eOptimal, usage,
|
||||
vk::SharingMode::eExclusive, 0, nullptr, vk::ImageLayout::eUndefined);
|
||||
vk::SharingMode::eExclusive, nullptr, vk::ImageLayout::eUndefined);
|
||||
image = device.createImageUnique(imageCreateInfo);
|
||||
|
||||
VmaAllocationCreateInfo allocCreateInfo = { VmaAllocationCreateFlags(), VmaMemoryUsage::VMA_MEMORY_USAGE_GPU_ONLY };
|
||||
|
|
|
@ -234,22 +234,22 @@ bool VulkanContext::init(retro_hw_render_interface_vulkan *retro_render_if)
|
|||
ShaderCompiler::Init();
|
||||
|
||||
// Descriptor pool
|
||||
vk::DescriptorPoolSize pool_sizes[] =
|
||||
std::array<vk::DescriptorPoolSize, 11> pool_sizes =
|
||||
{
|
||||
{ vk::DescriptorType::eSampler, 2 },
|
||||
{ vk::DescriptorType::eCombinedImageSampler, 40000 },
|
||||
{ vk::DescriptorType::eSampledImage, 2 },
|
||||
{ vk::DescriptorType::eStorageImage, 12 },
|
||||
{ vk::DescriptorType::eUniformTexelBuffer, 2 },
|
||||
{ vk::DescriptorType::eStorageTexelBuffer, 2 },
|
||||
{ vk::DescriptorType::eUniformBuffer, 80000 },
|
||||
{ vk::DescriptorType::eStorageBuffer, 50 },
|
||||
{ vk::DescriptorType::eUniformBufferDynamic, 2 },
|
||||
{ vk::DescriptorType::eStorageBufferDynamic, 2 },
|
||||
{ vk::DescriptorType::eInputAttachment, 50 }
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eSampler, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eCombinedImageSampler, 40000),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eSampledImage, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageImage, 12),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eUniformTexelBuffer, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageTexelBuffer, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, 80000),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageBuffer, 50),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBufferDynamic, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageBufferDynamic, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment, 50)
|
||||
};
|
||||
descriptorPool = device.createDescriptorPoolUnique(vk::DescriptorPoolCreateInfo(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet,
|
||||
40000, ARRAY_SIZE(pool_sizes), pool_sizes));
|
||||
40000, pool_sizes));
|
||||
|
||||
std::string cachePath = hostfs::getShaderCachePath("vulkan_pipeline.cache");
|
||||
FILE *f = fopen(cachePath.c_str(), "rb");
|
||||
|
|
|
@ -48,9 +48,9 @@ public:
|
|||
int GetCurrentImageIndex() const { return retro_render_if->get_sync_index(retro_render_if->handle); }
|
||||
|
||||
void WaitIdle() const { queue.waitIdle(); }
|
||||
void SubmitCommandBuffers(u32 bufferCount, vk::CommandBuffer *buffers, vk::Fence fence) {
|
||||
void SubmitCommandBuffers(const std::vector<vk::CommandBuffer> &buffers, vk::Fence fence) {
|
||||
retro_render_if->lock_queue(retro_render_if->handle);
|
||||
queue.submit(vk::SubmitInfo(0, nullptr, nullptr, bufferCount, buffers, 0, nullptr), fence);
|
||||
queue.submit(vk::SubmitInfo(nullptr, nullptr, buffers, nullptr), fence);
|
||||
retro_render_if->unlock_queue(retro_render_if->handle);
|
||||
}
|
||||
vk::DeviceSize GetUniformBufferAlignment() const { return uniformBufferAlignment; }
|
||||
|
|
|
@ -167,8 +167,7 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co
|
|||
layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
|
||||
#endif
|
||||
#endif
|
||||
vk::InstanceCreateInfo instanceCreateInfo({}, &applicationInfo, layer_names.size(), layer_names.data(),
|
||||
vext.size(), vext.data());
|
||||
vk::InstanceCreateInfo instanceCreateInfo({}, &applicationInfo, layer_names, vext);
|
||||
// create a UniqueInstance
|
||||
instance = vk::createInstanceUnique(instanceCreateInfo);
|
||||
|
||||
|
@ -302,14 +301,14 @@ void VulkanContext::InitImgui()
|
|||
if (ImGui::GetIO().Fonts->TexID == 0)
|
||||
{
|
||||
// Upload Fonts
|
||||
device->resetFences(1, &(*drawFences.front()));
|
||||
device->resetFences(*drawFences.front());
|
||||
device->resetCommandPool(*commandPools.front(), vk::CommandPoolResetFlagBits::eReleaseResources);
|
||||
vk::CommandBuffer& commandBuffer = *commandBuffers.front();
|
||||
commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit));
|
||||
ImGui_ImplVulkan_CreateFontsTexture((VkCommandBuffer)commandBuffer);
|
||||
commandBuffer.end();
|
||||
vk::SubmitInfo submitInfo(0, nullptr, nullptr, 1, &commandBuffer);
|
||||
graphicsQueue.submit(1, &submitInfo, *drawFences.front());
|
||||
vk::SubmitInfo submitInfo(nullptr, nullptr, commandBuffer);
|
||||
graphicsQueue.submit(submitInfo, *drawFences.front());
|
||||
|
||||
device->waitIdle();
|
||||
ImGui_ImplVulkan_DestroyFontUploadObjects();
|
||||
|
@ -418,8 +417,8 @@ bool VulkanContext::InitDevice()
|
|||
if (samplerAnisotropy)
|
||||
features.samplerAnisotropy = true;
|
||||
const char *layers[] = { "VK_LAYER_ARM_AGA" };
|
||||
device = physicalDevice.createDeviceUnique(vk::DeviceCreateInfo(vk::DeviceCreateFlags(), 1, &deviceQueueCreateInfo,
|
||||
0, layers, deviceExtensions.size(), &deviceExtensions[0], &features));
|
||||
device = physicalDevice.createDeviceUnique(vk::DeviceCreateInfo(vk::DeviceCreateFlags(), deviceQueueCreateInfo,
|
||||
layers, deviceExtensions, &features));
|
||||
|
||||
#ifndef TARGET_IPHONE
|
||||
// This links entry points directly from the driver and isn't absolutely necessary
|
||||
|
@ -431,22 +430,22 @@ bool VulkanContext::InitDevice()
|
|||
presentQueue = device->getQueue(presentQueueIndex, 0);
|
||||
|
||||
// Descriptor pool
|
||||
vk::DescriptorPoolSize pool_sizes[] =
|
||||
std::array<vk::DescriptorPoolSize, 11> pool_sizes =
|
||||
{
|
||||
{ vk::DescriptorType::eSampler, 2 },
|
||||
{ vk::DescriptorType::eCombinedImageSampler, 40000 },
|
||||
{ vk::DescriptorType::eSampledImage, 2 },
|
||||
{ vk::DescriptorType::eStorageImage, 12 },
|
||||
{ vk::DescriptorType::eUniformTexelBuffer, 2 },
|
||||
{ vk::DescriptorType::eStorageTexelBuffer, 2 },
|
||||
{ vk::DescriptorType::eUniformBuffer, 80000 },
|
||||
{ vk::DescriptorType::eStorageBuffer, 100 },
|
||||
{ vk::DescriptorType::eUniformBufferDynamic, 2 },
|
||||
{ vk::DescriptorType::eStorageBufferDynamic, 2 },
|
||||
{ vk::DescriptorType::eInputAttachment, 100 }
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eSampler, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eCombinedImageSampler, 40000),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eSampledImage, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageImage, 12),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eUniformTexelBuffer, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageTexelBuffer, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, 80000),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageBuffer, 100),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBufferDynamic, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eStorageBufferDynamic, 2),
|
||||
vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment, 100)
|
||||
};
|
||||
descriptorPool = device->createDescriptorPoolUnique(vk::DescriptorPoolCreateInfo(vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet,
|
||||
40000, ARRAY_SIZE(pool_sizes), pool_sizes));
|
||||
40000, pool_sizes));
|
||||
|
||||
|
||||
std::string cachePath = hostfs::getShaderCachePath("vulkan_pipeline.cache");
|
||||
|
@ -538,7 +537,7 @@ void VulkanContext::CreateSwapChain()
|
|||
vk::SurfaceCapabilitiesKHR surfaceCapabilities = physicalDevice.getSurfaceCapabilitiesKHR(GetSurface());
|
||||
DEBUG_LOG(RENDERER, "Surface capabilities: %d x %d, %s, image count: %d - %d", surfaceCapabilities.currentExtent.width, surfaceCapabilities.currentExtent.height,
|
||||
vk::to_string(surfaceCapabilities.currentTransform).c_str(), surfaceCapabilities.minImageCount, surfaceCapabilities.maxImageCount);
|
||||
VkExtent2D swapchainExtent;
|
||||
vk::Extent2D swapchainExtent;
|
||||
if (surfaceCapabilities.currentExtent.width == std::numeric_limits<uint32_t>::max())
|
||||
{
|
||||
// If the surface size is undefined, the size is set to the size of the images requested.
|
||||
|
@ -645,11 +644,11 @@ void VulkanContext::CreateSwapChain()
|
|||
vk::ImageLayout::eUndefined, vk::ImageLayout::ePresentSrcKHR);
|
||||
|
||||
vk::AttachmentReference colorReference(0, vk::ImageLayout::eColorAttachmentOptimal);
|
||||
vk::SubpassDescription subpass(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics, 0, nullptr, 1, &colorReference,
|
||||
vk::SubpassDescription subpass(vk::SubpassDescriptionFlags(), vk::PipelineBindPoint::eGraphics, nullptr, colorReference,
|
||||
nullptr, nullptr);
|
||||
|
||||
renderPass = device->createRenderPassUnique(vk::RenderPassCreateInfo(vk::RenderPassCreateFlags(),
|
||||
1, &attachmentDescription, 1, &subpass));
|
||||
attachmentDescription, subpass));
|
||||
|
||||
// Framebuffers, fences, semaphores
|
||||
|
||||
|
@ -660,7 +659,7 @@ void VulkanContext::CreateSwapChain()
|
|||
for (auto const& view : imageViews)
|
||||
{
|
||||
framebuffers.push_back(device->createFramebufferUnique(vk::FramebufferCreateInfo(vk::FramebufferCreateFlags(), *renderPass,
|
||||
1, &view.get(), width, height, 1)));
|
||||
view.get(), width, height, 1)));
|
||||
drawFences.push_back(device->createFenceUnique(vk::FenceCreateInfo(vk::FenceCreateFlagBits::eSignaled)));
|
||||
renderCompleteSemaphores.push_back(device->createSemaphoreUnique(vk::SemaphoreCreateInfo()));
|
||||
imageAcquiredSemaphores.push_back(device->createSemaphoreUnique(vk::SemaphoreCreateInfo()));
|
||||
|
@ -771,8 +770,8 @@ void VulkanContext::NewFrame()
|
|||
if (!IsValid())
|
||||
throw InvalidVulkanContext();
|
||||
device->acquireNextImageKHR(*swapChain, UINT64_MAX, *imageAcquiredSemaphores[currentSemaphore], nullptr, ¤tImage);
|
||||
device->waitForFences(1, &(*drawFences[currentImage]), true, UINT64_MAX);
|
||||
device->resetFences(1, &(*drawFences[currentImage]));
|
||||
device->waitForFences(*drawFences[currentImage], true, UINT64_MAX);
|
||||
device->resetFences(*drawFences[currentImage]);
|
||||
device->resetCommandPool(*commandPools[currentImage], vk::CommandPoolResetFlagBits::eReleaseResources);
|
||||
vk::CommandBuffer commandBuffer = *commandBuffers[currentImage];
|
||||
commandBuffer.begin(vk::CommandBufferBeginInfo(vk::CommandBufferUsageFlagBits::eOneTimeSubmit));
|
||||
|
@ -785,9 +784,9 @@ void VulkanContext::BeginRenderPass()
|
|||
{
|
||||
if (!IsValid())
|
||||
return;
|
||||
const vk::ClearValue clear_colors[] = { getBorderColor(), vk::ClearDepthStencilValue{ 0.f, 0 } };
|
||||
const std::array<vk::ClearValue, 2> clear_colors = { getBorderColor(), vk::ClearDepthStencilValue{ 0.f, 0 } };
|
||||
vk::CommandBuffer commandBuffer = *commandBuffers[currentImage];
|
||||
commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(*renderPass, *framebuffers[currentImage], vk::Rect2D({0, 0}, {width, height}), 2, clear_colors),
|
||||
commandBuffer.beginRenderPass(vk::RenderPassBeginInfo(*renderPass, *framebuffers[currentImage], vk::Rect2D({0, 0}, {width, height}), clear_colors),
|
||||
vk::SubpassContents::eInline);
|
||||
}
|
||||
|
||||
|
@ -798,14 +797,13 @@ void VulkanContext::EndFrame(vk::CommandBuffer overlayCmdBuffer)
|
|||
vk::CommandBuffer commandBuffer = *commandBuffers[currentImage];
|
||||
commandBuffer.endRenderPass();
|
||||
commandBuffer.end();
|
||||
vk::PipelineStageFlags wait_stage = vk::PipelineStageFlagBits::eColorAttachmentOutput;
|
||||
vk::PipelineStageFlags wait_stage(vk::PipelineStageFlagBits::eColorAttachmentOutput);
|
||||
std::vector<vk::CommandBuffer> allCmdBuffers;
|
||||
if (overlayCmdBuffer)
|
||||
allCmdBuffers.push_back(overlayCmdBuffer);
|
||||
allCmdBuffers.push_back(commandBuffer);
|
||||
vk::SubmitInfo submitInfo(1, &(*imageAcquiredSemaphores[currentSemaphore]), &wait_stage, allCmdBuffers.size(),allCmdBuffers.data(),
|
||||
1, &(*renderCompleteSemaphores[currentSemaphore]));
|
||||
graphicsQueue.submit(1, &submitInfo, *drawFences[currentImage]);
|
||||
vk::SubmitInfo submitInfo(*imageAcquiredSemaphores[currentSemaphore], wait_stage, allCmdBuffers, *renderCompleteSemaphores[currentSemaphore]);
|
||||
graphicsQueue.submit(submitInfo, *drawFences[currentImage]);
|
||||
verify(rendering);
|
||||
rendering = false;
|
||||
renderDone = true;
|
||||
|
@ -872,7 +870,7 @@ void VulkanContext::DrawFrame(vk::ImageView imageView, const vk::Extent2D& exten
|
|||
dx = width * (1 - renderAR / screenAR) / 2;
|
||||
|
||||
vk::Viewport viewport(dx, dy, width - dx * 2, height - dy * 2);
|
||||
commandBuffer.setViewport(0, 1, &viewport);
|
||||
commandBuffer.setViewport(0, viewport);
|
||||
commandBuffer.setScissor(0, vk::Rect2D(vk::Offset2D(dx, dy), vk::Extent2D(width - dx * 2, height - dy * 2)));
|
||||
if (config::Rotate90)
|
||||
quadRotateDrawer->Draw(commandBuffer, imageView, vtx, config::TextureFiltering == 1);
|
||||
|
@ -1003,7 +1001,7 @@ void VulkanContext::term()
|
|||
#ifndef USE_SDL
|
||||
surface.reset();
|
||||
#else
|
||||
::vkDestroySurfaceKHR((VkInstance)*instance, (VkSurfaceKHR)surface.release(), nullptr);
|
||||
instance->destroySurfaceKHR(surface.release());
|
||||
#endif
|
||||
pipelineCache.reset();
|
||||
device.reset();
|
||||
|
@ -1039,7 +1037,7 @@ void VulkanContext::DoSwapAutomation()
|
|||
vk::ImageCreateInfo imageCreateInfo(vk::ImageCreateFlags(), vk::ImageType::e2D, vk::Format::eR8G8B8A8Unorm,
|
||||
vk::Extent3D(width, height, 1), 1, 1,
|
||||
vk::SampleCountFlagBits::e1, vk::ImageTiling::eLinear, vk::ImageUsageFlagBits::eTransferDst,
|
||||
vk::SharingMode::eExclusive, 0, nullptr, vk::ImageLayout::eUndefined);
|
||||
vk::SharingMode::eExclusive, nullptr, vk::ImageLayout::eUndefined);
|
||||
vk::UniqueImage dstImage = device->createImageUnique(imageCreateInfo);
|
||||
|
||||
vk::MemoryRequirements memReq = device->getImageMemoryRequirements(*dstImage);
|
||||
|
@ -1099,8 +1097,8 @@ void VulkanContext::DoSwapAutomation()
|
|||
vk::DependencyFlags(), nullptr, nullptr, barrier);
|
||||
cmdBuffer->end();
|
||||
vk::PipelineStageFlags wait_stage = vk::PipelineStageFlagBits::eColorAttachmentOutput;
|
||||
vk::SubmitInfo submitInfo(0, nullptr, nullptr, 1, &cmdBuffer.get(), 0, nullptr);
|
||||
graphicsQueue.submit(1, &submitInfo, nullptr);
|
||||
vk::SubmitInfo submitInfo(nullptr, nullptr, cmdBuffer.get(), nullptr);
|
||||
graphicsQueue.submit(submitInfo, nullptr);
|
||||
graphicsQueue.waitIdle();
|
||||
|
||||
vk::ImageSubresource subresource(vk::ImageAspectFlagBits::eColor, 0, 0);
|
||||
|
@ -1141,7 +1139,7 @@ bool VulkanContext::HasSurfaceDimensionChanged() const
|
|||
{
|
||||
vk::SurfaceCapabilitiesKHR surfaceCapabilities =
|
||||
physicalDevice.getSurfaceCapabilitiesKHR(GetSurface());
|
||||
VkExtent2D swapchainExtent;
|
||||
vk::Extent2D swapchainExtent;
|
||||
if (surfaceCapabilities.currentExtent.width == std::numeric_limits < uint32_t > ::max())
|
||||
{
|
||||
// If the surface size is undefined, the size is set to the size of the images requested.
|
||||
|
|
|
@ -104,9 +104,9 @@ public:
|
|||
u32 GetVendorID() const { return vendorID; }
|
||||
vk::CommandBuffer PrepareOverlay(bool vmu, bool crosshair);
|
||||
void DrawOverlay(float scaling, bool vmu, bool crosshair);
|
||||
void SubmitCommandBuffers(u32 bufferCount, vk::CommandBuffer *buffers, vk::Fence fence) {
|
||||
void SubmitCommandBuffers(const std::vector<vk::CommandBuffer> &buffers, vk::Fence fence) {
|
||||
graphicsQueue.submit(
|
||||
vk::SubmitInfo(0, nullptr, nullptr, bufferCount, buffers), fence);
|
||||
vk::SubmitInfo(nullptr, nullptr, buffers), fence);
|
||||
}
|
||||
bool hasPerPixel() override { return fragmentStoresAndAtomics; }
|
||||
bool recreateSwapChainIfNeeded();
|
||||
|
|
|
@ -197,12 +197,11 @@ public:
|
|||
|
||||
osdPipeline.BindDescriptorSets(cmdBuffer);
|
||||
const vk::Viewport viewport(0, 0, (float)settings.display.width, (float)settings.display.height, 0, 1.f);
|
||||
cmdBuffer.setViewport(0, 1, &viewport);
|
||||
cmdBuffer.setViewport(0, viewport);
|
||||
const vk::Rect2D scissor({ 0, 0 }, { (u32)settings.display.width, (u32)settings.display.height });
|
||||
cmdBuffer.setScissor(0, 1, &scissor);
|
||||
cmdBuffer.setScissor(0, scissor);
|
||||
osdBuffer->upload((u32)(osdVertices.size() * sizeof(OSDVertex)), osdVertices.data());
|
||||
const vk::DeviceSize zero = 0;
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &osdBuffer->buffer.get(), &zero);
|
||||
cmdBuffer.bindVertexBuffers(0, osdBuffer->buffer.get(), {0});
|
||||
for (u32 i = 0; i < (u32)osdVertices.size(); i += 4)
|
||||
cmdBuffer.draw(4, 1, i, 0);
|
||||
if (clear_screen)
|
||||
|
|
Loading…
Reference in New Issue