Create a RenderState object for each thread

This commit is contained in:
Magnus Norddahl 2023-05-17 22:39:22 +02:00
commit 7bdf3f7364
10 changed files with 62 additions and 31 deletions

View file

@ -190,11 +190,15 @@ void VulkanRenderDevice::InitializeState()
mShaderManager.reset(new VkShaderManager(this));
mDescriptorSetManager->Init();
for (int threadIndex = 0; threadIndex < MaxThreads; threadIndex++)
{
#ifdef __APPLE__
mRenderState.reset(new VkRenderStateMolten(this));
mRenderState.push_back(std::make_unique<VkRenderStateMolten>(this));
#else
mRenderState.reset(new VkRenderState(this, 0));
mRenderState.push_back(std::make_unique<VkRenderState>(this, 0));
#endif
}
}
void VulkanRenderDevice::Update()
@ -209,8 +213,11 @@ void VulkanRenderDevice::Update()
Draw2D();
twod->Clear();
mRenderState->EndRenderPass();
mRenderState->EndFrame();
for (auto& renderstate : mRenderState)
{
renderstate->EndRenderPass();
renderstate->EndFrame();
}
Flush3D.Unclock();
@ -232,13 +239,19 @@ void VulkanRenderDevice::RenderTextureView(FCanvasTexture* tex, std::function<vo
VkTextureImage *image = BaseLayer->GetImage(tex, 0, 0);
VkTextureImage *depthStencil = BaseLayer->GetDepthStencil(tex);
mRenderState->EndRenderPass();
for (auto& renderstate : mRenderState)
{
renderstate->EndRenderPass();
}
VkImageTransition()
.AddImage(image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, false)
.Execute(mCommands->GetDrawCommands());
mRenderState->SetRenderTarget(image, depthStencil->View.get(), image->Image->width, image->Image->height, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT);
for (auto& renderstate : mRenderState)
{
renderstate->SetRenderTarget(image, depthStencil->View.get(), image->Image->width, image->Image->height, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT);
}
IntRect bounds;
bounds.left = bounds.top = 0;
@ -247,13 +260,19 @@ void VulkanRenderDevice::RenderTextureView(FCanvasTexture* tex, std::function<vo
renderFunc(bounds);
mRenderState->EndRenderPass();
for (auto& renderstate : mRenderState)
{
renderstate->EndRenderPass();
}
VkImageTransition()
.AddImage(image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false)
.Execute(mCommands->GetDrawCommands());
mRenderState->SetRenderTarget(&GetBuffers()->SceneColor, GetBuffers()->SceneDepthStencil.View.get(), GetBuffers()->GetWidth(), GetBuffers()->GetHeight(), VK_FORMAT_R16G16B16A16_SFLOAT, GetBuffers()->GetSceneSamples());
for (auto& renderstate : mRenderState)
{
renderstate->SetRenderTarget(&GetBuffers()->SceneColor, GetBuffers()->SceneDepthStencil.View.get(), GetBuffers()->GetWidth(), GetBuffers()->GetHeight(), VK_FORMAT_R16G16B16A16_SFLOAT, GetBuffers()->GetSceneSamples());
}
tex->SetUpdated(true);
}
@ -450,7 +469,8 @@ void VulkanRenderDevice::BeginFrame()
mTextureManager->BeginFrame();
mScreenBuffers->BeginFrame(screen->mScreenViewport.width, screen->mScreenViewport.height, screen->mSceneViewport.width, screen->mSceneViewport.height);
mSaveBuffers->BeginFrame(SAVEPICWIDTH, SAVEPICHEIGHT, SAVEPICWIDTH, SAVEPICHEIGHT);
mRenderState->BeginFrame();
for (auto& renderstate : mRenderState)
renderstate->BeginFrame();
mDescriptorSetManager->BeginFrame();
}
@ -465,7 +485,7 @@ void VulkanRenderDevice::InitLightmap(int LMTextureSize, int LMTextureCount, TAr
void VulkanRenderDevice::Draw2D()
{
::Draw2D(twod, *mRenderState);
::Draw2D(twod, *RenderState(0));
}
void VulkanRenderDevice::WaitForCommands(bool finish)
@ -545,9 +565,9 @@ void VulkanRenderDevice::ImageTransitionScene(bool unknown)
mPostprocess->ImageTransitionScene(unknown);
}
FRenderState* VulkanRenderDevice::RenderState()
FRenderState* VulkanRenderDevice::RenderState(int threadIndex)
{
return mRenderState.get();
return mRenderState[threadIndex].get();
}
void VulkanRenderDevice::AmbientOccludeScene(float m5)
@ -557,5 +577,8 @@ void VulkanRenderDevice::AmbientOccludeScene(float m5)
void VulkanRenderDevice::SetSceneRenderTarget(bool useSSAO)
{
mRenderState->SetRenderTarget(&GetBuffers()->SceneColor, GetBuffers()->SceneDepthStencil.View.get(), GetBuffers()->GetWidth(), GetBuffers()->GetHeight(), VK_FORMAT_R16G16B16A16_SFLOAT, GetBuffers()->GetSceneSamples());
for (auto& renderstate : mRenderState)
{
renderstate->SetRenderTarget(&GetBuffers()->SceneColor, GetBuffers()->SceneDepthStencil.View.get(), GetBuffers()->GetWidth(), GetBuffers()->GetHeight(), VK_FORMAT_R16G16B16A16_SFLOAT, GetBuffers()->GetSceneSamples());
}
}