From 1c4798f059ef462da4f203665b2f3c7ee0dcd7d6 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 11 Jun 2022 16:28:51 +0200 Subject: [PATCH] Move lightmap and shadowmap textures to VkTextureManager --- .../vulkan/renderer/vk_descriptorset.cpp | 4 +- .../vulkan/renderer/vk_postprocess.cpp | 5 +- .../vulkan/system/vk_framebuffer.cpp | 63 +--------- .../vulkan/textures/vk_renderbuffers.cpp | 72 ----------- .../vulkan/textures/vk_renderbuffers.h | 8 -- .../rendering/vulkan/textures/vk_samplers.cpp | 24 ++++ .../rendering/vulkan/textures/vk_samplers.h | 5 + .../rendering/vulkan/textures/vk_texture.cpp | 116 +++++++++++++++++- .../rendering/vulkan/textures/vk_texture.h | 11 ++ 9 files changed, 161 insertions(+), 147 deletions(-) diff --git a/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp b/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp index 78e50f9e8..a6cfcb41e 100644 --- a/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp @@ -110,8 +110,8 @@ void VkDescriptorSetManager::CreateFixedSet() void VkDescriptorSetManager::UpdateFixedSet() { WriteDescriptors update; - update.addCombinedImageSampler(FixedSet.get(), 0, fb->GetBuffers()->Shadowmap.View.get(), fb->GetBuffers()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - update.addCombinedImageSampler(FixedSet.get(), 1, fb->GetBuffers()->Lightmap.View.get(), fb->GetBuffers()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.addCombinedImageSampler(FixedSet.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.addCombinedImageSampler(FixedSet.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); update.addBuffer(FixedSet.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightBufferSSO->mBuffer.get()); if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) update.addAccelerationStructure(FixedSet.get(), 3, fb->GetRaytrace()->GetAccelStruct()); diff --git a/src/common/rendering/vulkan/renderer/vk_postprocess.cpp b/src/common/rendering/vulkan/renderer/vk_postprocess.cpp index e719ffcd7..f79167bf7 100644 --- a/src/common/rendering/vulkan/renderer/vk_postprocess.cpp +++ b/src/common/rendering/vulkan/renderer/vk_postprocess.cpp @@ -33,6 +33,7 @@ #include "vulkan/textures/vk_pptexture.h" #include "vulkan/textures/vk_renderbuffers.h" #include "vulkan/textures/vk_imagetransition.h" +#include "vulkan/textures/vk_texture.h" #include "hw_cvars.h" #include "hwrenderer/postprocessing/hw_postprocess.h" #include "hwrenderer/postprocessing/hw_postprocess_cvars.h" @@ -276,10 +277,8 @@ void VkPostprocess::UpdateShadowMap() VkPPRenderState renderstate(fb); hw_postprocess.shadowmap.Update(&renderstate); - auto buffers = fb->GetBuffers(); - VkImageTransition imageTransition; - imageTransition.addImage(&buffers->Shadowmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false); + imageTransition.addImage(&fb->GetTextureManager()->Shadowmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false); imageTransition.execute(fb->GetCommands()->GetDrawCommands()); screen->mShadowMap.FinishUpdate(); diff --git a/src/common/rendering/vulkan/system/vk_framebuffer.cpp b/src/common/rendering/vulkan/system/vk_framebuffer.cpp index fc22af0e3..8e94c382a 100644 --- a/src/common/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/common/rendering/vulkan/system/vk_framebuffer.cpp @@ -398,6 +398,7 @@ TArray VulkanFrameBuffer::GetScreenshotBuffer(int &pitch, ESSType &colo void VulkanFrameBuffer::BeginFrame() { SetViewportRects(nullptr); + mTextureManager->BeginFrame(); mScreenBuffers->BeginFrame(screen->mScreenViewport.width, screen->mScreenViewport.height, screen->mSceneViewport.width, screen->mSceneViewport.height); mSaveBuffers->BeginFrame(SAVEPICWIDTH, SAVEPICHEIGHT, SAVEPICWIDTH, SAVEPICHEIGHT); mRenderState->BeginFrame(); @@ -413,67 +414,7 @@ void VulkanFrameBuffer::InitLightmap(int LMTextureSize, int LMTextureCount, TArr { if (LMTextureData.Size() > 0) { - int w = LMTextureSize; - int h = LMTextureSize; - int count = LMTextureCount; - int pixelsize = 8; - auto& lightmap = mActiveRenderBuffers->Lightmap; - - lightmap.Reset(this); - - ImageBuilder builder; - builder.setSize(w, h, 1, count); - builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT); - builder.setUsage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); - lightmap.Image = builder.create(device); - lightmap.Image->SetDebugName("VkRenderBuffers.Lightmap"); - - ImageViewBuilder viewbuilder; - viewbuilder.setType(VK_IMAGE_VIEW_TYPE_2D_ARRAY); - viewbuilder.setImage(lightmap.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT); - lightmap.View = viewbuilder.create(device); - lightmap.View->SetDebugName("VkRenderBuffers.LightmapView"); - - auto cmdbuffer = GetCommands()->GetTransferCommands(); - - int totalSize = w * h * count * pixelsize; - - BufferBuilder bufbuilder; - bufbuilder.setSize(totalSize); - bufbuilder.setUsage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY); - std::unique_ptr stagingBuffer = bufbuilder.create(device); - stagingBuffer->SetDebugName("VkHardwareTexture.mStagingBuffer"); - - uint16_t one = 0x3c00; // half-float 1.0 - uint16_t* src = &LMTextureData[0]; - uint16_t* data = (uint16_t*)stagingBuffer->Map(0, totalSize); - for (int i = w * h * count; i > 0; i--) - { - *(data++) = *(src++); - *(data++) = *(src++); - *(data++) = *(src++); - *(data++) = one; - } - stagingBuffer->Unmap(); - - VkImageTransition imageTransition; - imageTransition.addImage(&lightmap, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, true, 0, count); - imageTransition.execute(cmdbuffer); - - VkBufferImageCopy region = {}; - region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - region.imageSubresource.layerCount = count; - region.imageExtent.depth = 1; - region.imageExtent.width = w; - region.imageExtent.height = h; - cmdbuffer->copyBufferToImage(stagingBuffer->buffer, lightmap.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); - - VkImageTransition barrier; - barrier.addImage(&lightmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, count); - barrier.execute(cmdbuffer); - - GetCommands()->TransferDeleteList->Add(std::move(stagingBuffer)); - + GetTextureManager()->SetLightmap(LMTextureSize, LMTextureCount, LMTextureData); LMTextureData.Reset(); // We no longer need this, release the memory } } diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp index 2d9e8d4e7..2c6c98aac 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.cpp @@ -75,9 +75,6 @@ void VkRenderBuffers::BeginFrame(int width, int height, int sceneWidth, int scen if (width != mWidth || height != mHeight || mSamples != samples) CreateScene(width, height, samples); - CreateShadowmap(); - CreateLightmapSampler(); - mWidth = width; mHeight = height; mSamples = samples; @@ -215,75 +212,6 @@ void VkRenderBuffers::CreateSceneNormal(int width, int height, VkSampleCountFlag SceneNormal.View->SetDebugName("VkRenderBuffers.SceneNormalView"); } -void VkRenderBuffers::CreateShadowmap() -{ - if (Shadowmap.Image && Shadowmap.Image->width == gl_shadowmap_quality) - return; - - Shadowmap.Reset(fb); - - ImageBuilder builder; - builder.setSize(gl_shadowmap_quality, 1024); - builder.setFormat(VK_FORMAT_R32_SFLOAT); - builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); - Shadowmap.Image = builder.create(fb->device); - Shadowmap.Image->SetDebugName("VkRenderBuffers.Shadowmap"); - - ImageViewBuilder viewbuilder; - viewbuilder.setImage(Shadowmap.Image.get(), VK_FORMAT_R32_SFLOAT); - Shadowmap.View = viewbuilder.create(fb->device); - Shadowmap.View->SetDebugName("VkRenderBuffers.ShadowmapView"); - - VkImageTransition barrier; - barrier.addImage(&Shadowmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); - barrier.execute(fb->GetCommands()->GetDrawCommands()); - - if (!ShadowmapSampler) - { - SamplerBuilder samplerBuilder; - samplerBuilder.setMipmapMode(VK_SAMPLER_MIPMAP_MODE_NEAREST); - samplerBuilder.setMinFilter(VK_FILTER_NEAREST); - samplerBuilder.setMagFilter(VK_FILTER_NEAREST); - samplerBuilder.setAddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); - ShadowmapSampler = samplerBuilder.create(fb->device); - ShadowmapSampler->SetDebugName("VkRenderBuffers.ShadowmapSampler"); - } -} - -void VkRenderBuffers::CreateLightmapSampler() -{ - if (!Lightmap.Image) - { - ImageBuilder builder; - builder.setSize(1, 1); - builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT); - builder.setUsage(VK_IMAGE_USAGE_SAMPLED_BIT); - Lightmap.Image = builder.create(fb->device); - Lightmap.Image->SetDebugName("VkRenderBuffers.Lightmap"); - - ImageViewBuilder viewbuilder; - viewbuilder.setType(VK_IMAGE_VIEW_TYPE_2D_ARRAY); - viewbuilder.setImage(Lightmap.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT); - Lightmap.View = viewbuilder.create(fb->device); - Lightmap.View->SetDebugName("VkRenderBuffers.LightmapView"); - - VkImageTransition barrier; - barrier.addImage(&Lightmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); - barrier.execute(fb->GetCommands()->GetDrawCommands()); - } - - if (!LightmapSampler) - { - SamplerBuilder builder; - builder.setMipmapMode(VK_SAMPLER_MIPMAP_MODE_LINEAR); - builder.setMinFilter(VK_FILTER_LINEAR); - builder.setMagFilter(VK_FILTER_LINEAR); - builder.setAddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); - LightmapSampler = builder.create(fb->device); - LightmapSampler->SetDebugName("VkRenderBuffers.LightmapSampler"); - } -} - VulkanFramebuffer* VkRenderBuffers::GetOutput(VkPPRenderPassSetup* passSetup, const PPOutput& output, bool stencilTest, int& framebufferWidth, int& framebufferHeight) { VkTextureImage* tex = fb->GetTextureManager()->GetTexture(output.Type, output.Texture); diff --git a/src/common/rendering/vulkan/textures/vk_renderbuffers.h b/src/common/rendering/vulkan/textures/vk_renderbuffers.h index dd89d235f..04d5667d5 100644 --- a/src/common/rendering/vulkan/textures/vk_renderbuffers.h +++ b/src/common/rendering/vulkan/textures/vk_renderbuffers.h @@ -33,12 +33,6 @@ public: static const int NumPipelineImages = 2; VkTextureImage PipelineImage[NumPipelineImages]; - VkTextureImage Shadowmap; - std::unique_ptr ShadowmapSampler; - - VkTextureImage Lightmap; - std::unique_ptr LightmapSampler; - VulkanFramebuffer* GetOutput(VkPPRenderPassSetup* passSetup, const PPOutput& output, bool stencilTest, int& framebufferWidth, int& framebufferHeight); private: @@ -48,8 +42,6 @@ private: void CreateSceneDepthStencil(int width, int height, VkSampleCountFlagBits samples); void CreateSceneFog(int width, int height, VkSampleCountFlagBits samples); void CreateSceneNormal(int width, int height, VkSampleCountFlagBits samples); - void CreateShadowmap(); - void CreateLightmapSampler(); VkSampleCountFlagBits GetBestSampleCount(); VulkanFrameBuffer* fb = nullptr; diff --git a/src/common/rendering/vulkan/textures/vk_samplers.cpp b/src/common/rendering/vulkan/textures/vk_samplers.cpp index 96a14e877..2f762f119 100644 --- a/src/common/rendering/vulkan/textures/vk_samplers.cpp +++ b/src/common/rendering/vulkan/textures/vk_samplers.cpp @@ -69,6 +69,8 @@ static VkTexClamp TexClamp[] = VkSamplerManager::VkSamplerManager(VulkanFrameBuffer* fb) : fb(fb) { CreateHWSamplers(); + CreateShadowmapSampler(); + CreateLightmapSampler(); } VkSamplerManager::~VkSamplerManager() @@ -163,3 +165,25 @@ VulkanSampler* VkSamplerManager::Get(PPFilterMode filter, PPWrapMode wrap) sampler->SetDebugName("VkPostprocess.mSamplers"); return sampler.get(); } + +void VkSamplerManager::CreateShadowmapSampler() +{ + SamplerBuilder samplerBuilder; + samplerBuilder.setMipmapMode(VK_SAMPLER_MIPMAP_MODE_NEAREST); + samplerBuilder.setMinFilter(VK_FILTER_NEAREST); + samplerBuilder.setMagFilter(VK_FILTER_NEAREST); + samplerBuilder.setAddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); + ShadowmapSampler = samplerBuilder.create(fb->device); + ShadowmapSampler->SetDebugName("VkRenderBuffers.ShadowmapSampler"); +} + +void VkSamplerManager::CreateLightmapSampler() +{ + SamplerBuilder builder; + builder.setMipmapMode(VK_SAMPLER_MIPMAP_MODE_LINEAR); + builder.setMinFilter(VK_FILTER_LINEAR); + builder.setMagFilter(VK_FILTER_LINEAR); + builder.setAddressMode(VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); + LightmapSampler = builder.create(fb->device); + LightmapSampler->SetDebugName("VkRenderBuffers.LightmapSampler"); +} diff --git a/src/common/rendering/vulkan/textures/vk_samplers.h b/src/common/rendering/vulkan/textures/vk_samplers.h index c630a944d..b50da70e8 100644 --- a/src/common/rendering/vulkan/textures/vk_samplers.h +++ b/src/common/rendering/vulkan/textures/vk_samplers.h @@ -19,9 +19,14 @@ public: VulkanSampler *Get(int no) const { return mSamplers[no].get(); } VulkanSampler* Get(PPFilterMode filter, PPWrapMode wrap); + std::unique_ptr ShadowmapSampler; + std::unique_ptr LightmapSampler; + private: void CreateHWSamplers(); void DeleteHWSamplers(); + void CreateShadowmapSampler(); + void CreateLightmapSampler(); VulkanFrameBuffer* fb = nullptr; std::array, NUMSAMPLERS> mSamplers; diff --git a/src/common/rendering/vulkan/textures/vk_texture.cpp b/src/common/rendering/vulkan/textures/vk_texture.cpp index 69858dab2..361cddaec 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.cpp +++ b/src/common/rendering/vulkan/textures/vk_texture.cpp @@ -25,10 +25,13 @@ #include "vk_pptexture.h" #include "vk_renderbuffers.h" #include "vulkan/renderer/vk_postprocess.h" +#include "hw_cvars.h" VkTextureManager::VkTextureManager(VulkanFrameBuffer* fb) : fb(fb) { CreateNullTexture(); + CreateShadowmap(); + CreateLightmap(); } VkTextureManager::~VkTextureManager() @@ -39,6 +42,15 @@ VkTextureManager::~VkTextureManager() RemovePPTexture(PPTextures.back()); } +void VkTextureManager::BeginFrame() +{ + if (!Shadowmap.Image || Shadowmap.Image->width != gl_shadowmap_quality) + { + Shadowmap.Reset(fb); + CreateShadowmap(); + } +} + void VkTextureManager::AddTexture(VkHardwareTexture* texture) { texture->it = Textures.insert(Textures.end(), texture); @@ -96,7 +108,7 @@ VkTextureImage* VkTextureManager::GetTexture(const PPTextureType& type, PPTextur } else if (type == PPTextureType::ShadowMap) { - return &fb->GetBuffers()->Shadowmap; + return &Shadowmap; } else if (type == PPTextureType::SwapChain) { @@ -139,3 +151,105 @@ void VkTextureManager::CreateNullTexture() barrier.addImage(NullTexture.get(), VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0, VK_ACCESS_SHADER_READ_BIT, VK_IMAGE_ASPECT_COLOR_BIT); barrier.execute(fb->GetCommands()->GetTransferCommands(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); } + +void VkTextureManager::CreateShadowmap() +{ + ImageBuilder builder; + builder.setSize(gl_shadowmap_quality, 1024); + builder.setFormat(VK_FORMAT_R32_SFLOAT); + builder.setUsage(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); + Shadowmap.Image = builder.create(fb->device); + Shadowmap.Image->SetDebugName("VkRenderBuffers.Shadowmap"); + + ImageViewBuilder viewbuilder; + viewbuilder.setImage(Shadowmap.Image.get(), VK_FORMAT_R32_SFLOAT); + Shadowmap.View = viewbuilder.create(fb->device); + Shadowmap.View->SetDebugName("VkRenderBuffers.ShadowmapView"); + + VkImageTransition barrier; + barrier.addImage(&Shadowmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); + barrier.execute(fb->GetCommands()->GetDrawCommands()); +} + +void VkTextureManager::CreateLightmap() +{ + ImageBuilder builder; + builder.setSize(1, 1); + builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT); + builder.setUsage(VK_IMAGE_USAGE_SAMPLED_BIT); + Lightmap.Image = builder.create(fb->device); + Lightmap.Image->SetDebugName("VkRenderBuffers.Lightmap"); + + ImageViewBuilder viewbuilder; + viewbuilder.setType(VK_IMAGE_VIEW_TYPE_2D_ARRAY); + viewbuilder.setImage(Lightmap.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT); + Lightmap.View = viewbuilder.create(fb->device); + Lightmap.View->SetDebugName("VkRenderBuffers.LightmapView"); + + VkImageTransition barrier; + barrier.addImage(&Lightmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, true); + barrier.execute(fb->GetCommands()->GetDrawCommands()); +} + +void VkTextureManager::SetLightmap(int LMTextureSize, int LMTextureCount, const TArray& LMTextureData) +{ + int w = LMTextureSize; + int h = LMTextureSize; + int count = LMTextureCount; + int pixelsize = 8; + + Lightmap.Reset(fb); + + ImageBuilder builder; + builder.setSize(w, h, 1, count); + builder.setFormat(VK_FORMAT_R16G16B16A16_SFLOAT); + builder.setUsage(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); + Lightmap.Image = builder.create(fb->device); + Lightmap.Image->SetDebugName("VkRenderBuffers.Lightmap"); + + ImageViewBuilder viewbuilder; + viewbuilder.setType(VK_IMAGE_VIEW_TYPE_2D_ARRAY); + viewbuilder.setImage(Lightmap.Image.get(), VK_FORMAT_R16G16B16A16_SFLOAT); + Lightmap.View = viewbuilder.create(fb->device); + Lightmap.View->SetDebugName("VkRenderBuffers.LightmapView"); + + auto cmdbuffer = fb->GetCommands()->GetTransferCommands(); + + int totalSize = w * h * count * pixelsize; + + BufferBuilder bufbuilder; + bufbuilder.setSize(totalSize); + bufbuilder.setUsage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VMA_MEMORY_USAGE_CPU_ONLY); + std::unique_ptr stagingBuffer = bufbuilder.create(fb->device); + stagingBuffer->SetDebugName("VkHardwareTexture.mStagingBuffer"); + + uint16_t one = 0x3c00; // half-float 1.0 + const uint16_t* src = LMTextureData.Data(); + uint16_t* data = (uint16_t*)stagingBuffer->Map(0, totalSize); + for (int i = w * h * count; i > 0; i--) + { + *(data++) = *(src++); + *(data++) = *(src++); + *(data++) = *(src++); + *(data++) = one; + } + stagingBuffer->Unmap(); + + VkImageTransition imageTransition; + imageTransition.addImage(&Lightmap, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, true, 0, count); + imageTransition.execute(cmdbuffer); + + VkBufferImageCopy region = {}; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = count; + region.imageExtent.depth = 1; + region.imageExtent.width = w; + region.imageExtent.height = h; + cmdbuffer->copyBufferToImage(stagingBuffer->buffer, Lightmap.Image->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + + VkImageTransition barrier; + barrier.addImage(&Lightmap, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, false, 0, count); + barrier.execute(cmdbuffer); + + fb->GetCommands()->TransferDeleteList->Add(std::move(stagingBuffer)); +} diff --git a/src/common/rendering/vulkan/textures/vk_texture.h b/src/common/rendering/vulkan/textures/vk_texture.h index badf1a8dc..fc19827da 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.h +++ b/src/common/rendering/vulkan/textures/vk_texture.h @@ -2,6 +2,7 @@ #pragma once #include "vulkan/system/vk_objects.h" +#include "vulkan/textures/vk_imagetransition.h" #include class VulkanFrameBuffer; @@ -18,6 +19,10 @@ public: VkTextureManager(VulkanFrameBuffer* fb); ~VkTextureManager(); + void BeginFrame(); + + void SetLightmap(int LMTextureSize, int LMTextureCount, const TArray& LMTextureData); + VkTextureImage* GetTexture(const PPTextureType& type, PPTexture* tex); VkFormat GetTextureFormat(PPTexture* texture); @@ -30,8 +35,14 @@ public: VulkanImage* GetNullTexture() { return NullTexture.get(); } VulkanImageView* GetNullTextureView() { return NullTextureView.get(); } + VkTextureImage Shadowmap; + VkTextureImage Lightmap; + private: void CreateNullTexture(); + void CreateShadowmap(); + void CreateLightmap(); + VkPPTexture* GetVkTexture(PPTexture* texture); VulkanFrameBuffer* fb = nullptr;