Manage viewpoint buffer internally in the backend

This commit is contained in:
Magnus Norddahl 2023-04-30 02:32:04 +02:00 committed by Christoph Oelckers
parent 309330d222
commit 62a227621a
20 changed files with 78 additions and 240 deletions

View file

@ -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

View file

@ -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

View file

@ -65,6 +65,10 @@ public:
// Vertices
std::pair<FFlatVertex*, unsigned int> 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<Mesh> Create();

View file

@ -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<FFlatVertex*, unsigned int> 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)
{

View file

@ -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];
}

View file

@ -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<bool> 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; }
};

View file

@ -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;

View file

@ -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; }

View file

@ -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);

View file

@ -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<VkHardwareDataBuffer> UBO;
} Viewpoint;
VkHardwareDataBuffer* LightBufferSSO = nullptr;
VkHardwareDataBuffer* LightNodes = nullptr;
VkHardwareDataBuffer* LightLines = nullptr;

View file

@ -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()
{

View file

@ -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;

View file

@ -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())

View file

@ -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<uint8_t> 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);

View file

@ -78,7 +78,6 @@ public:
IBuffer* CreateLightBuffer() override;
IBuffer* CreateBoneBuffer() override;
IBuffer* CreateViewpointBuffer() override;
IBuffer* CreateShadowmapNodesBuffer() override;
IBuffer* CreateShadowmapLinesBuffer() override;
IBuffer* CreateShadowmapLightsBuffer() override;

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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

View file

@ -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();
}