Create a RenderState object for each thread
This commit is contained in:
parent
83254204ff
commit
7bdf3f7364
10 changed files with 62 additions and 31 deletions
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue