- create pipeline images

- fix some minor typos
This commit is contained in:
Magnus Norddahl 2019-03-06 17:59:11 +01:00
parent 108ea066f3
commit 40c14bcd67
4 changed files with 33 additions and 3 deletions

View file

@ -237,7 +237,7 @@ void VkPostprocess::RenderEffect(const FString &name)
VkPPRenderPassKey key; VkPPRenderPassKey key;
key.BlendMode = step.BlendMode; key.BlendMode = step.BlendMode;
key.InputTextures = step.Textures.Size(); key.InputTextures = step.Textures.Size();
key.Uniforms = step.Uniforms.Data.Size() != 0; key.Uniforms = step.Uniforms.Data.Size();
key.Shader = mShaders[step.ShaderName].get(); key.Shader = mShaders[step.ShaderName].get();
key.OutputFormat = (step.Output.Type == PPTextureType::PPTexture) ? mTextures[step.Output.Texture]->Format : VK_FORMAT_R16G16B16A16_SFLOAT; key.OutputFormat = (step.Output.Type == PPTextureType::PPTexture) ? mTextures[step.Output.Texture]->Format : VK_FORMAT_R16G16B16A16_SFLOAT;

View file

@ -59,6 +59,7 @@ private:
std::map<PPShaderName, std::unique_ptr<VkPPShader>> mShaders; std::map<PPShaderName, std::unique_ptr<VkPPShader>> mShaders;
std::array<std::unique_ptr<VulkanSampler>, 16> mSamplers; std::array<std::unique_ptr<VulkanSampler>, 16> mSamplers;
std::map<VkPPRenderPassKey, std::unique_ptr<VkPPRenderPassSetup>> mRenderPassSetup; std::map<VkPPRenderPassKey, std::unique_ptr<VkPPRenderPassSetup>> mRenderPassSetup;
int mCurrentPipelineImage = 0;
}; };
class VkPPShader class VkPPShader

View file

@ -41,6 +41,31 @@ void VkRenderBuffers::BeginFrame(int width, int height, int sceneWidth, int scen
void VkRenderBuffers::CreatePipeline(int width, int height) void VkRenderBuffers::CreatePipeline(int width, int height)
{ {
auto fb = GetVulkanFrameBuffer();
for (int i = 0; i < NumPipelineImages; i++)
{
PipelineImage[i].reset();
PipelineView[i].reset();
}
PipelineBarrier barrier;
for (int i = 0; i < NumPipelineImages; i++)
{
ImageBuilder builder;
builder.setSize(width, height);
builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT);
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
PipelineImage[i] = builder.create(fb->device);
ImageViewBuilder viewbuilder;
viewbuilder.setImage(PipelineImage[i].get(), VK_FORMAT_R16G16B16A16_SFLOAT);
PipelineView[i] = viewbuilder.create(fb->device);
barrier.addImage(PipelineImage[i].get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
PipelineLayout[i] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
}
barrier.execute(fb->GetDrawCommands(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT);
} }
void VkRenderBuffers::CreateScene(int width, int height, int samples) void VkRenderBuffers::CreateScene(int width, int height, int samples)
@ -54,7 +79,7 @@ void VkRenderBuffers::CreateScene(int width, int height, int samples)
SceneDepthStencil.reset(); SceneDepthStencil.reset();
ImageBuilder builder; ImageBuilder builder;
builder.setSize(SCREENWIDTH, SCREENHEIGHT); builder.setSize(width, height);
builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT); builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT);
builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
SceneColor = builder.create(fb->device); SceneColor = builder.create(fb->device);

View file

@ -21,9 +21,13 @@ public:
std::unique_ptr<VulkanImageView> SceneColorView; std::unique_ptr<VulkanImageView> SceneColorView;
std::unique_ptr<VulkanImageView> SceneDepthStencilView; std::unique_ptr<VulkanImageView> SceneDepthStencilView;
std::unique_ptr<VulkanImageView> SceneDepthView; std::unique_ptr<VulkanImageView> SceneDepthView;
VkFormat SceneDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT; VkFormat SceneDepthStencilFormat = VK_FORMAT_D24_UNORM_S8_UINT;
static const int NumPipelineImages = 2;
std::unique_ptr<VulkanImage> PipelineImage[NumPipelineImages];
std::unique_ptr<VulkanImageView> PipelineView[NumPipelineImages];
VkImageLayout PipelineLayout[NumPipelineImages];
private: private:
void CreatePipeline(int width, int height); void CreatePipeline(int width, int height);
void CreateScene(int width, int height, int samples); void CreateScene(int width, int height, int samples);