diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 722ef09516..837e5f783f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1098,7 +1098,6 @@ set (PCH_SOURCES common/rendering/hwrenderer/data/hw_clock.cpp common/rendering/hwrenderer/data/hw_skydome.cpp common/rendering/hwrenderer/data/flatvertices.cpp - common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp common/rendering/hwrenderer/data/hw_modelvertexbuffer.cpp common/rendering/hwrenderer/data/hw_cvars.cpp common/rendering/hwrenderer/data/hw_vrmodes.cpp diff --git a/src/common/rendering/hwrenderer/data/buffers.h b/src/common/rendering/hwrenderer/data/buffers.h index 1f53a251bd..a195525e7f 100644 --- a/src/common/rendering/hwrenderer/data/buffers.h +++ b/src/common/rendering/hwrenderer/data/buffers.h @@ -72,7 +72,7 @@ public: virtual void SetSubData(size_t offset, size_t size, const void *data) = 0; virtual void *Lock(unsigned int size) = 0; virtual void Unlock() = 0; - virtual void Resize(size_t newsize) = 0; + //virtual void Resize(size_t newsize) = 0; virtual void Upload(size_t start, size_t size) {} // For unmappable buffers diff --git a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h index 068c922551..344acaffbd 100644 --- a/src/common/rendering/hwrenderer/data/hw_meshbuilder.h +++ b/src/common/rendering/hwrenderer/data/hw_meshbuilder.h @@ -65,6 +65,10 @@ public: // Vertices std::pair AllocVertices(unsigned int count) override; + // Buffers + int SetViewpoint(const HWViewpointUniforms& vp) override { return 0; } + void SetViewpoint(int index) override { } + // Draw commands void Draw(int dt, int index, int count, bool apply = true) override; void DrawIndexed(int dt, int index, int count, bool apply = true) override; @@ -77,10 +81,8 @@ public: void ClearScreen() override { } void SetScissor(int x, int y, int w, int h) override { } void SetViewport(int x, int y, int w, int h) override { } - void EnableMultisampling(bool on) override { } void EnableLineSmooth(bool on) override { } void EnableDrawBuffers(int count, bool apply) override { } - void EnableClipDistance(int num, bool state) override { } void SetDepthRange(float min, float max) override { } bool SetDepthClamp(bool on) override { return false; } void SetDepthMask(bool on) override { } @@ -89,7 +91,6 @@ public: void SetCulling(int mode) override { } void EnableStencil(bool on) override { } void EnableDepthTest(bool on) override { } - void SetViewpointOffset(uint32_t offset) override { } std::unique_ptr Create(); diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index fc5632932c..12abce5b1c 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -6,9 +6,12 @@ #include "texmanip.h" #include "version.h" #include "i_interface.h" +#include "hw_viewpointuniforms.h" +#include "hw_cvars.h" struct FColormap; class IBuffer; +struct HWViewpointUniforms; enum EClearTarget { @@ -731,11 +734,31 @@ public: mColorMapFlash = flash; } + int Set2DViewpoint(int width, int height, int palLightLevels = 0) + { + HWViewpointUniforms matrices; + matrices.mViewMatrix.loadIdentity(); + matrices.mNormalViewMatrix.loadIdentity(); + matrices.mViewHeight = 0; + matrices.mGlobVis = 1.f; + matrices.mPalLightLevels = palLightLevels; + matrices.mClipLine.X = -10000000.0f; + matrices.mShadowmapFilter = gl_shadowmap_filter; + matrices.mLightBlendMode = 0; + matrices.mProjectionMatrix.ortho(0, (float)width, (float)height, 0, -1.0f, 1.0f); + matrices.CalcDependencies(); + return SetViewpoint(matrices); + } + // API-dependent render interface // Vertices virtual std::pair AllocVertices(unsigned int count); + // Buffers + virtual int SetViewpoint(const HWViewpointUniforms& vp) = 0; + virtual void SetViewpoint(int index) = 0; + // Draw commands virtual void ClearScreen() = 0; virtual void Draw(int dt, int index, int count, bool apply = true) = 0; @@ -749,16 +772,13 @@ public: virtual void SetColorMask(bool r, bool g, bool b, bool a) = 0; // Used by portals. virtual void SetStencil(int offs, int op, int flags=-1) = 0; // Used by portal setup and render hacks. virtual void SetCulling(int mode) = 0; // Used by model drawer only. - virtual void EnableClipDistance(int num, bool state) = 0; // Use by sprite sorter for vertical splits. virtual void Clear(int targets) = 0; // not used during normal rendering virtual void EnableStencil(bool on) = 0; // always on for 3D, always off for 2D virtual void SetScissor(int x, int y, int w, int h) = 0; // constant for 3D, changes for 2D virtual void SetViewport(int x, int y, int w, int h) = 0; // constant for all 3D and all 2D virtual void EnableDepthTest(bool on) = 0; // used by 2D, portals and render hacks. - virtual void EnableMultisampling(bool on) = 0; // only active for 2D virtual void EnableLineSmooth(bool on) = 0; // constant setting for each 2D drawer operation virtual void EnableDrawBuffers(int count, bool apply = false) = 0; // Used by SSAO and EnableDrawBufferAttachments - virtual void SetViewpointOffset(uint32_t offset) = 0; // HWViewpoint uniform binding offset void SetColorMask(bool on) { diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp b/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp deleted file mode 100644 index e09ded90e4..0000000000 --- a/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// -//--------------------------------------------------------------------------- -// -// Copyright(C) 2018 Christoph Oelckers -// All rights reserved. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with this program. If not, see http://www.gnu.org/licenses/ -// -//-------------------------------------------------------------------------- -// -/* -** gl_viewpointbuffer.cpp -** Buffer data maintenance for per viewpoint uniform data -** -**/ - -#include "hw_viewpointuniforms.h" -#include "hw_renderstate.h" -#include "hw_viewpointbuffer.h" -#include "hw_cvars.h" -#include "v_video.h" - -static const int INITIAL_BUFFER_SIZE = 100; // 100 viewpoints per frame should nearly always be enough - -HWViewpointBuffer::HWViewpointBuffer(DFrameBuffer* fb, int pipelineNbr) : fb(fb), mPipelineNbr(pipelineNbr) -{ - mBufferSize = INITIAL_BUFFER_SIZE; - mBlockAlign = ((sizeof(HWViewpointUniforms) / fb->uniformblockalignment) + 1) * fb->uniformblockalignment; - mByteSize = mBufferSize * mBlockAlign; - - for (int n = 0; n < mPipelineNbr; n++) - { - mBufferPipeline[n] = fb->CreateViewpointBuffer(); - mBufferPipeline[n]->SetData(mByteSize, nullptr, BufferUsageType::Persistent); - } - - Clear(); - mLastMappedIndex = UINT_MAX; -} - -HWViewpointBuffer::~HWViewpointBuffer() -{ - delete mBuffer; -} - - -void HWViewpointBuffer::CheckSize() -{ - if (mUploadIndex >= mBufferSize) - { - mBufferSize *= 2; - mByteSize *= 2; - for (int n = 0; n < mPipelineNbr; n++) - { - mBufferPipeline[n]->Resize(mByteSize); - } - } -} - -int HWViewpointBuffer::Bind(FRenderState &di, unsigned int index) -{ - if (index != mLastMappedIndex) - { - mLastMappedIndex = index; - di.SetViewpointOffset(index * mBlockAlign); - di.EnableClipDistance(0, mClipPlaneInfo[index]); - } - return index; -} - -void HWViewpointBuffer::Set2D(FRenderState &di, int width, int height, int pll) -{ - HWViewpointUniforms matrices; - - matrices.mViewMatrix.loadIdentity(); - matrices.mNormalViewMatrix.loadIdentity(); - matrices.mViewHeight = 0; - matrices.mGlobVis = 1.f; - matrices.mPalLightLevels = pll; - matrices.mClipLine.X = -10000000.0f; - matrices.mShadowmapFilter = gl_shadowmap_filter; - matrices.mLightBlendMode = 0; - - matrices.mProjectionMatrix.ortho(0, (float)width, (float)height, 0, -1.0f, 1.0f); - matrices.CalcDependencies(); - - CheckSize(); - mBuffer->Map(); - memcpy(((char*)mBuffer->Memory()) + mUploadIndex * mBlockAlign, &matrices, sizeof(matrices)); - mBuffer->Unmap(); - - mClipPlaneInfo.Push(0); - - Bind(di, mUploadIndex++); -} - -int HWViewpointBuffer::SetViewpoint(FRenderState &di, HWViewpointUniforms *vp) -{ - CheckSize(); - mBuffer->Map(); - memcpy(((char*)mBuffer->Memory()) + mUploadIndex * mBlockAlign, vp, sizeof(*vp)); - mBuffer->Unmap(); - - mClipPlaneInfo.Push(vp->mClipHeightDirection != 0.f || vp->mClipLine.X > -10000000.0f); - return Bind(di, mUploadIndex++); -} - -void HWViewpointBuffer::Clear() -{ - bool needNewPipeline = mUploadIndex > 0; // Clear might be called multiple times before any actual rendering - - mUploadIndex = 0; - mClipPlaneInfo.Clear(); - - if (needNewPipeline) - { - mLastMappedIndex = UINT_MAX; - - mPipelinePos++; - mPipelinePos %= mPipelineNbr; - } - - mBuffer = mBufferPipeline[mPipelinePos]; -} - diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.h b/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.h deleted file mode 100644 index a5b8d8af85..0000000000 --- a/src/common/rendering/hwrenderer/data/hw_viewpointbuffer.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include "tarray.h" -#include "hwrenderer/data/buffers.h" - -struct HWViewpointUniforms; -class DFrameBuffer; -class FRenderState; - -class HWViewpointBuffer -{ - DFrameBuffer* fb = nullptr; - IBuffer* mBuffer; - IBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS]; - int mPipelineNbr; - int mPipelinePos = 0; - - unsigned int mBufferSize; - unsigned int mBlockAlign; - unsigned int mUploadIndex; - unsigned int mLastMappedIndex; - unsigned int mByteSize; - TArray mClipPlaneInfo; - - unsigned int mBlockSize; - - void CheckSize(); - -public: - - HWViewpointBuffer(DFrameBuffer* fb, int pipelineNbr = 1); - ~HWViewpointBuffer(); - void Clear(); - int Bind(FRenderState &di, unsigned int index); - void Set2D(FRenderState &di, int width, int height, int pll = 0); - int SetViewpoint(FRenderState &di, HWViewpointUniforms *vp); - unsigned int GetBlockSize() const { return mBlockSize; } -}; - diff --git a/src/common/rendering/hwrenderer/hw_draw2d.cpp b/src/common/rendering/hwrenderer/hw_draw2d.cpp index 5c7100b34f..74e44b5a2e 100644 --- a/src/common/rendering/hwrenderer/hw_draw2d.cpp +++ b/src/common/rendering/hwrenderer/hw_draw2d.cpp @@ -36,7 +36,6 @@ #include "cmdlib.h" #include "hwrenderer/data/buffers.h" #include "flatvertices.h" -#include "hwrenderer/data/hw_viewpointbuffer.h" #include "hw_clock.h" #include "hw_cvars.h" #include "hw_renderstate.h" @@ -62,13 +61,12 @@ void Draw2D(F2DDrawer* drawer, FRenderState& state, int x, int y, int width, int twoD.Clock(); state.SetViewport(x, y, width, height); - screen->mViewpoints->Set2D(state, drawer->GetWidth(), drawer->GetHeight()); + state.Set2DViewpoint(drawer->GetWidth(), drawer->GetHeight()); state.EnableStencil(false); state.SetStencil(0, SOP_Keep, SF_AllOn); state.Clear(CT_Stencil); state.EnableDepthTest(false); - state.EnableMultisampling(false); state.EnableLineSmooth(gl_aalines); auto &vertices = drawer->mVertices; diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index 88fcad9925..19d4bcd6c8 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -52,7 +52,6 @@ struct FPortalSceneState; class FSkyVertexBuffer; class IBuffer; class FFlatVertexBuffer; -class HWViewpointBuffer; class FLightBuffer; struct HWDrawInfo; class FMaterial; @@ -141,7 +140,6 @@ public: const char *vendorstring; // We have to account for some issues with particular vendors. FSkyVertexBuffer *mSkyData = nullptr; // the sky vertex buffer FFlatVertexBuffer *mVertexData = nullptr; // Global vertex data - HWViewpointBuffer *mViewpoints = nullptr; // Viewpoint render data. FLightBuffer *mLights = nullptr; // Dynamic lights BoneBuffer* mBones = nullptr; // Model bones ShadowMap* mShadowMap = nullptr; @@ -242,7 +240,6 @@ public: // To do: these buffers shouldn't be created by the hwrenderer layer - it will be simpler if the backend manages them completely virtual IBuffer* CreateLightBuffer() { return nullptr; } virtual IBuffer* CreateBoneBuffer() { return nullptr; } - virtual IBuffer* CreateViewpointBuffer() { return nullptr; } virtual IBuffer* CreateShadowmapNodesBuffer() { return nullptr; } virtual IBuffer* CreateShadowmapLinesBuffer() { return nullptr; } virtual IBuffer* CreateShadowmapLightsBuffer() { return nullptr; } diff --git a/src/common/rendering/vulkan/buffers/vk_buffer.cpp b/src/common/rendering/vulkan/buffers/vk_buffer.cpp index c84208124d..ade7b3ee12 100644 --- a/src/common/rendering/vulkan/buffers/vk_buffer.cpp +++ b/src/common/rendering/vulkan/buffers/vk_buffer.cpp @@ -39,11 +39,19 @@ void VkBufferManager::Init() MatrixBuffer.reset(new VkStreamBuffer(this, sizeof(MatricesUBO), 50000)); StreamBuffer.reset(new VkStreamBuffer(this, sizeof(StreamUBO), 300)); + Viewpoint.BlockAlign = (sizeof(HWViewpointUniforms) + fb->uniformblockalignment - 1) / fb->uniformblockalignment * fb->uniformblockalignment; + Viewpoint.UBO.reset(new VkHardwareDataBuffer(fb, false, true)); + Viewpoint.UBO->SetData(Viewpoint.Count * Viewpoint.BlockAlign, nullptr, BufferUsageType::Persistent); + Viewpoint.UBO->Map(); + CreateFanToTrisIndexBuffer(); } void VkBufferManager::Deinit() { + Viewpoint.UBO->Unmap(); + Viewpoint.UBO.reset(); + while (!Buffers.empty()) RemoveBuffer(Buffers.back()); } @@ -59,7 +67,7 @@ void VkBufferManager::RemoveBuffer(VkHardwareBuffer* buffer) buffer->fb = nullptr; Buffers.erase(buffer->it); - for (VkHardwareDataBuffer** knownbuf : { &ViewpointUBO, &LightBufferSSO, &LightNodes, &LightLines, &LightList, &BoneBufferSSO }) + for (VkHardwareDataBuffer** knownbuf : { &LightBufferSSO, &LightNodes, &LightLines, &LightList, &BoneBufferSSO}) { if (buffer == *knownbuf) *knownbuf = nullptr; } @@ -87,12 +95,6 @@ IBuffer* VkBufferManager::CreateBoneBuffer() return BoneBufferSSO; } -IBuffer* VkBufferManager::CreateViewpointBuffer() -{ - ViewpointUBO = new VkHardwareDataBuffer(fb, false, true); - return ViewpointUBO; -} - IBuffer* VkBufferManager::CreateShadowmapNodesBuffer() { LightNodes = new VkHardwareDataBuffer(fb, true, false); diff --git a/src/common/rendering/vulkan/buffers/vk_buffer.h b/src/common/rendering/vulkan/buffers/vk_buffer.h index 8deea10447..b756b9fce6 100644 --- a/src/common/rendering/vulkan/buffers/vk_buffer.h +++ b/src/common/rendering/vulkan/buffers/vk_buffer.h @@ -10,6 +10,7 @@ class VkHardwareDataBuffer; class VkStreamBuffer; class IBuffer; struct FVertexBufferAttribute; +struct HWViewpointUniforms; class VkBufferManager { @@ -25,7 +26,6 @@ public: IBuffer* CreateLightBuffer(); IBuffer* CreateBoneBuffer(); - IBuffer* CreateViewpointBuffer(); IBuffer* CreateShadowmapNodesBuffer(); IBuffer* CreateShadowmapLinesBuffer(); IBuffer* CreateShadowmapLightsBuffer(); @@ -33,7 +33,14 @@ public: void AddBuffer(VkHardwareBuffer* buffer); void RemoveBuffer(VkHardwareBuffer* buffer); - VkHardwareDataBuffer* ViewpointUBO = nullptr; + struct + { + int UploadIndex = 0; + int BlockAlign = 0; + int Count = 1000; + std::unique_ptr UBO; + } Viewpoint; + VkHardwareDataBuffer* LightBufferSSO = nullptr; VkHardwareDataBuffer* LightNodes = nullptr; VkHardwareDataBuffer* LightLines = nullptr; diff --git a/src/common/rendering/vulkan/buffers/vk_hwbuffer.cpp b/src/common/rendering/vulkan/buffers/vk_hwbuffer.cpp index d3bf75cba6..879f48f80a 100644 --- a/src/common/rendering/vulkan/buffers/vk_hwbuffer.cpp +++ b/src/common/rendering/vulkan/buffers/vk_hwbuffer.cpp @@ -158,6 +158,7 @@ void VkHardwareBuffer::SetSubData(size_t offset, size_t size, const void *data) } } +/* void VkHardwareBuffer::Resize(size_t newsize) { newsize = max(newsize, (size_t)16); // For supporting zero byte buffers @@ -188,6 +189,7 @@ void VkHardwareBuffer::Resize(size_t newsize) // Fetch pointer to new buffer map = mBuffer->Map(0, newsize); } +*/ void VkHardwareBuffer::Map() { diff --git a/src/common/rendering/vulkan/buffers/vk_hwbuffer.h b/src/common/rendering/vulkan/buffers/vk_hwbuffer.h index 4927d9c5a6..da540a419d 100644 --- a/src/common/rendering/vulkan/buffers/vk_hwbuffer.h +++ b/src/common/rendering/vulkan/buffers/vk_hwbuffer.h @@ -17,7 +17,7 @@ public: void SetData(size_t size, const void *data, BufferUsageType usage) override; void SetSubData(size_t offset, size_t size, const void *data) override; - void Resize(size_t newsize) override; + //void Resize(size_t newsize) override; void Map() override; void Unmap() override; diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 774dcc06d5..b466428679 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -81,7 +81,7 @@ void VkDescriptorSetManager::UpdateHWBufferSet() } WriteDescriptors() - .AddBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)) + .AddBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->Viewpoint.UBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)) .AddBuffer(HWBufferSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO)) .AddBuffer(HWBufferSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO)) .AddBuffer(HWBufferSet.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightBufferSSO->mBuffer.get()) diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 7fbe520477..eb69198d71 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -37,7 +37,6 @@ #include "hw_vrmodes.h" #include "hw_cvars.h" #include "hw_skydome.h" -#include "hwrenderer/data/hw_viewpointbuffer.h" #include "flatvertices.h" #include "hw_lightbuffer.h" #include "hw_bonebuffer.h" @@ -134,7 +133,6 @@ VulkanRenderDevice::~VulkanRenderDevice() delete mVertexData; delete mSkyData; - delete mViewpoints; delete mLights; delete mBones; delete mShadowMap; @@ -193,7 +191,6 @@ void VulkanRenderDevice::InitializeState() mVertexData = new FFlatVertexBuffer(this, GetWidth(), GetHeight()); mSkyData = new FSkyVertexBuffer(this); - mViewpoints = new HWViewpointBuffer(this); mLights = new FLightBuffer(this); mBones = new BoneBuffer(this); mShadowMap = new ShadowMap(this); @@ -332,11 +329,6 @@ IBuffer* VulkanRenderDevice::CreateBoneBuffer() return GetBufferManager()->CreateBoneBuffer(); } -IBuffer* VulkanRenderDevice::CreateViewpointBuffer() -{ - return GetBufferManager()->CreateViewpointBuffer(); -} - IBuffer* VulkanRenderDevice::CreateShadowmapNodesBuffer() { return GetBufferManager()->CreateShadowmapNodesBuffer(); @@ -486,7 +478,7 @@ TArray VulkanRenderDevice::GetScreenshotBuffer(int &pitch, ESSType &col void VulkanRenderDevice::BeginFrame() { SetViewportRects(nullptr); - mViewpoints->Clear(); + mBufferManager->Viewpoint.UploadIndex = 0; mCommands->BeginFrame(); mTextureManager->BeginFrame(); mScreenBuffers->BeginFrame(screen->mScreenViewport.width, screen->mScreenViewport.height, screen->mSceneViewport.width, screen->mSceneViewport.height); diff --git a/src/common/rendering/vulkan/vk_renderdevice.h b/src/common/rendering/vulkan/vk_renderdevice.h index ab26359b74..833325a8ad 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.h +++ b/src/common/rendering/vulkan/vk_renderdevice.h @@ -78,7 +78,6 @@ public: IBuffer* CreateLightBuffer() override; IBuffer* CreateBoneBuffer() override; - IBuffer* CreateViewpointBuffer() override; IBuffer* CreateShadowmapNodesBuffer() override; IBuffer* CreateShadowmapLinesBuffer() override; IBuffer* CreateShadowmapLightsBuffer() override; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index b262acf0e4..650f149143 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -36,7 +36,6 @@ #include "hw_cvars.h" #include "hw_clock.h" #include "flatvertices.h" -#include "hwrenderer/data/hw_viewpointbuffer.h" CVAR(Int, vk_submit_size, 1000, 0); EXTERN_CVAR(Bool, r_skipmats) @@ -48,7 +47,7 @@ VkRenderState::VkRenderState(VulkanRenderDevice* fb) : fb(fb), mStreamBufferWrit void VkRenderState::ClearScreen() { - screen->mViewpoints->Set2D(*this, SCREENWIDTH, SCREENHEIGHT); + Set2DViewpoint(SCREENWIDTH, SCREENHEIGHT); SetColor(0, 0, 0); Apply(DT_TriangleStrip); mCommandBuffer->draw(4, 1, FFlatVertexBuffer::FULLSCREEN_INDEX, 0); @@ -127,10 +126,6 @@ void VkRenderState::SetCulling(int mode) mNeedApply = true; } -void VkRenderState::EnableClipDistance(int num, bool state) -{ -} - void VkRenderState::Clear(int targets) { mClearTargets = targets; @@ -169,10 +164,6 @@ void VkRenderState::EnableDepthTest(bool on) mNeedApply = true; } -void VkRenderState::EnableMultisampling(bool on) -{ -} - void VkRenderState::EnableLineSmooth(bool on) { } @@ -492,9 +483,23 @@ void VkRenderState::WaitForStreamBuffers() mMatrixBufferWriter.Reset(); } -void VkRenderState::SetViewpointOffset(uint32_t offset) +int VkRenderState::SetViewpoint(const HWViewpointUniforms& vp) { - mViewpointOffset = offset; + auto buffers = fb->GetBufferManager(); + if (buffers->Viewpoint.Count == buffers->Viewpoint.UploadIndex) + { + return buffers->Viewpoint.Count - 1; + } + memcpy(((char*)buffers->Viewpoint.UBO->Memory()) + buffers->Viewpoint.UploadIndex * buffers->Viewpoint.BlockAlign, &vp, sizeof(HWViewpointUniforms)); + int index = buffers->Viewpoint.UploadIndex++; + mViewpointOffset = index * buffers->Viewpoint.BlockAlign; + mNeedApply = true; + return index; +} + +void VkRenderState::SetViewpoint(int index) +{ + mViewpointOffset = index * fb->GetBufferManager()->Viewpoint.BlockAlign; mNeedApply = true; } diff --git a/src/common/rendering/vulkan/vk_renderstate.h b/src/common/rendering/vulkan/vk_renderstate.h index c78dd39437..201f1d20fd 100644 --- a/src/common/rendering/vulkan/vk_renderstate.h +++ b/src/common/rendering/vulkan/vk_renderstate.h @@ -34,22 +34,22 @@ public: void SetColorMask(bool r, bool g, bool b, bool a) override; void SetStencil(int offs, int op, int flags = -1) override; void SetCulling(int mode) override; - void EnableClipDistance(int num, bool state) override; void Clear(int targets) override; void EnableStencil(bool on) override; void SetScissor(int x, int y, int w, int h) override; void SetViewport(int x, int y, int w, int h) override; void EnableDepthTest(bool on) override; - void EnableMultisampling(bool on) override; void EnableLineSmooth(bool on) override; void EnableDrawBuffers(int count, bool apply) override; - void SetViewpointOffset(uint32_t offset) override; void BeginFrame(); void SetRenderTarget(VkTextureImage *image, VulkanImageView *depthStencilView, int width, int height, VkFormat Format, VkSampleCountFlagBits samples); void EndRenderPass(); void EndFrame(); + int SetViewpoint(const HWViewpointUniforms& vp) override; + void SetViewpoint(int index) override; + protected: void Apply(int dt); void ApplyRenderPass(int dt); diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index a1611ae5ed..a075568006 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -46,7 +46,6 @@ #include "hw_lightbuffer.h" #include "hw_bonebuffer.h" #include "hw_cvars.h" -#include "hwrenderer/data/hw_viewpointbuffer.h" #include "hwrenderer/scene/hw_fakeflat.h" #include "hwrenderer/scene/hw_clipper.h" #include "hwrenderer/scene/hw_portal.h" @@ -282,7 +281,6 @@ void WriteSavePic(player_t* player, FileWriter* file, int width, int height) RenderState.SetVertexBuffer(screen->mVertexData); screen->mLights->Clear(); screen->mBones->Clear(); - screen->mViewpoints->Clear(); // This shouldn't overwrite the global viewpoint even for a short time. FRenderViewpoint savevp; @@ -348,7 +346,6 @@ sector_t* RenderView(player_t* player) screen->mLights->Clear(); screen->mBones->Clear(); - screen->mViewpoints->Clear(); // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. bool saved_niv = NoInterpolateView; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 56a04238bc..0e07a9f80d 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -38,7 +38,6 @@ #include "models.h" #include "hw_clock.h" #include "hw_cvars.h" -#include "hw_viewpointbuffer.h" #include "flatvertices.h" #include "hw_lightbuffer.h" #include "hw_bonebuffer.h" @@ -400,7 +399,7 @@ void HWDrawInfo::SetupView(FRenderState &state, float vx, float vy, float vz, bo SetViewMatrix(vp.HWAngles, vx, vy, vz, mirror, planemirror); SetCameraPos(vp.Pos); VPUniforms.CalcDependencies(); - vpIndex = screen->mViewpoints->SetViewpoint(state, &VPUniforms); + vpIndex = state.SetViewpoint(VPUniforms); } //----------------------------------------------------------------------------- @@ -598,7 +597,7 @@ void HWDrawInfo::RenderPortal(HWPortal *p, FRenderState &state, bool usestencil) gp->DrawContents(new_di, state); new_di->EndDrawInfo(); state.SetVertexBuffer(screen->mVertexData); - screen->mViewpoints->Bind(state, vpIndex); + state.SetViewpoint(vpIndex); gp->RemoveStencil(this, state, usestencil); } @@ -688,7 +687,7 @@ void HWDrawInfo::DrawCoronas(FRenderState& state) HWViewpointUniforms vp = VPUniforms; vp.mViewMatrix.loadIdentity(); vp.mProjectionMatrix = VRMode::GetVRMode(true)->GetHUDSpriteProjection(); - screen->mViewpoints->SetViewpoint(state, &vp); + state.SetViewpoint(vp); float timeElapsed = (screen->FrameTime - LastFrameTime) / 1000.0f; LastFrameTime = screen->FrameTime; @@ -721,7 +720,7 @@ void HWDrawInfo::DrawCoronas(FRenderState& state) } state.SetTextureMode(TM_NORMAL); - screen->mViewpoints->Bind(state, vpIndex); + state.SetViewpoint(vpIndex); state.EnableDepthTest(true); state.SetDepthMask(true); } @@ -770,9 +769,8 @@ void HWDrawInfo::DrawEndScene2D(sector_t * viewsector, FRenderState &state) HWViewpointUniforms vp = VPUniforms; vp.mViewMatrix.loadIdentity(); vp.mProjectionMatrix = vrmode->GetHUDSpriteProjection(); - screen->mViewpoints->SetViewpoint(state, &vp); + state.SetViewpoint(vp); state.EnableDepthTest(false); - state.EnableMultisampling(false); DrawPlayerSprites(false, state); @@ -802,7 +800,6 @@ void HWDrawInfo::Set3DViewport(FRenderState &state) const auto &bounds = screen->mSceneViewport; state.SetViewport(bounds.left, bounds.top, bounds.width, bounds.height); state.SetScissor(bounds.left, bounds.top, bounds.width, bounds.height); - state.EnableMultisampling(true); state.EnableDepthTest(true); state.EnableStencil(true); state.SetStencil(0, SOP_Keep, SF_AllOn); @@ -858,7 +855,7 @@ void HWDrawInfo::DrawScene(int drawmode, FRenderState& state) if (applySSAO && state.GetPassType() == GBUFFER_PASS) { screen->AmbientOccludeScene(VPUniforms.mProjectionMatrix.get()[5]); - screen->mViewpoints->Bind(state, vpIndex); + state.SetViewpoint(vpIndex); } // Handle all portals after rendering the opaque objects but before diff --git a/src/rendering/hwrenderer/scene/hw_drawlist.cpp b/src/rendering/hwrenderer/scene/hw_drawlist.cpp index 6f13b7f137..37930fef53 100644 --- a/src/rendering/hwrenderer/scene/hw_drawlist.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawlist.cpp @@ -944,11 +944,7 @@ void HWDrawList::DrawSorted(HWDrawInfo *di, FRenderState &state) screen->mVertexData->Unmap(); } state.ClearClipSplit(); - state.EnableClipDistance(1, true); - state.EnableClipDistance(2, true); DrawSorted(di, state, sorted); - state.EnableClipDistance(1, false); - state.EnableClipDistance(2, false); state.ClearClipSplit(); }