From 5a4e5a80381bee099529a5a7512b24ff2af61296 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 27 Oct 2018 14:42:24 +0200 Subject: [PATCH] - moved the remaining parts of the main vertex buffer to hwrenderer. --- src/gl/data/gl_vertexbuffer.cpp | 67 ----------------------- src/gl/data/gl_vertexbuffer.h | 73 ------------------------- src/gl/renderer/gl_postprocess.cpp | 2 +- src/gl/renderer/gl_renderer.cpp | 2 +- src/gl/renderer/gl_renderer.h | 4 +- src/gl/scene/gl_drawinfo.cpp | 2 +- src/gl/shaders/gl_shader.h | 9 --- src/hwrenderer/data/flatvertices.cpp | 82 +++++++++++++++++++++++++++- src/hwrenderer/data/flatvertices.h | 68 ++++++++++++++++++++++- src/hwrenderer/data/vertexbuffer.h | 12 ++-- 10 files changed, 158 insertions(+), 163 deletions(-) diff --git a/src/gl/data/gl_vertexbuffer.cpp b/src/gl/data/gl_vertexbuffer.cpp index 1bfcf76da..c3d61b988 100644 --- a/src/gl/data/gl_vertexbuffer.cpp +++ b/src/gl/data/gl_vertexbuffer.cpp @@ -116,70 +116,3 @@ void FSkyVertexBuffer::BindVBO() glDisableVertexAttribArray(VATTR_NORMAL); } -//========================================================================== -// -// -// -//========================================================================== - -FGLFlatVertexBuffer::FGLFlatVertexBuffer(int width, int height) -: FFlatVertexBuffer(width, height) -{ - mVertexBuffer = screen->CreateVertexBuffer(); - mIndexBuffer = screen->CreateIndexBuffer(); - - unsigned int bytesize = BUFFER_SIZE * sizeof(FFlatVertex); - mVertexBuffer->SetData(bytesize, nullptr, false); - - static const FVertexBufferAttribute format[] = { - { 0, VATTR_VERTEX, VFmt_Float3, myoffsetof(FFlatVertex, x) }, - { 0, VATTR_TEXCOORD, VFmt_Float2, myoffsetof(FFlatVertex, u) } - }; - mVertexBuffer->SetFormat(1, 2, sizeof(FFlatVertex), format); - - mIndex = mCurIndex = 0; - mNumReserved = NUM_RESERVED; - Copy(0, NUM_RESERVED); -} - -FGLFlatVertexBuffer::~FGLFlatVertexBuffer() -{ - delete mIndexBuffer; - delete mVertexBuffer; - mIndexBuffer = nullptr; - mVertexBuffer = nullptr; -} - -void FGLFlatVertexBuffer::Copy(int start, int count) -{ - Map(); - memcpy(GetBuffer(start), &vbo_shadowdata[0], count * sizeof(FFlatVertex)); - Unmap(); -} - -void FGLFlatVertexBuffer::OutputResized(int width, int height) -{ - FFlatVertexBuffer::OutputResized(width, height); - Copy(4, 4); -} - -void FGLFlatVertexBuffer::Bind(FRenderState &state) -{ - state.SetVertexBuffer(mVertexBuffer, 0, 0); - state.SetIndexBuffer(mIndexBuffer); -} - -//========================================================================== -// -// -// -//========================================================================== - -void FGLFlatVertexBuffer::CreateVBO() -{ - vbo_shadowdata.Resize(mNumReserved); - FFlatVertexBuffer::CreateVertices(); - mCurIndex = mIndex = vbo_shadowdata.Size(); - Copy(0, mIndex); - mIndexBuffer->SetData(ibo_data.Size() * sizeof(uint32_t), &ibo_data[0]); -} diff --git a/src/gl/data/gl_vertexbuffer.h b/src/gl/data/gl_vertexbuffer.h index 5ca52bfee..8d0c35637 100644 --- a/src/gl/data/gl_vertexbuffer.h +++ b/src/gl/data/gl_vertexbuffer.h @@ -86,79 +86,6 @@ public: void EnableColorArray(bool on); }; -class FGLFlatVertexBuffer : public FFlatVertexBuffer -{ - IVertexBuffer *mVertexBuffer; - IIndexBuffer *mIndexBuffer; - - unsigned int mIndex; - std::atomic mCurIndex; - std::mutex mBufferMutex; - unsigned int mNumReserved; - - - static const unsigned int BUFFER_SIZE = 2000000; - static const unsigned int BUFFER_SIZE_TO_USE = 1999500; - - -public: - - FGLFlatVertexBuffer(int width, int height); - ~FGLFlatVertexBuffer(); - - void OutputResized(int width, int height); - void Bind(FRenderState &state); - void CreateVBO(); - void Copy(int start, int count); - - FFlatVertex *GetBuffer(int index) const - { - FFlatVertex *ff = (FFlatVertex*)mVertexBuffer->Memory(); - return &ff[index]; - } - - FFlatVertex *GetBuffer() const - { - return GetBuffer(mCurIndex); - } - - template - FFlatVertex *Alloc(int num, T *poffset) - { - again: - FFlatVertex *p = GetBuffer(); - auto index = mCurIndex.fetch_add(num); - *poffset = static_cast(index); - if (index + num >= BUFFER_SIZE_TO_USE) - { - std::lock_guard lock(mBufferMutex); - if (mCurIndex >= BUFFER_SIZE_TO_USE) // retest condition, in case another thread got here first - mCurIndex = mIndex; - - if (index >= BUFFER_SIZE_TO_USE) goto again; - } - return p; - } - - void Reset() - { - mCurIndex = mIndex; - } - - void Map() - { - mVertexBuffer->Map(); - mMap = GetBuffer(0); - } - - void Unmap() - { - mMap = nullptr; - mVertexBuffer->Unmap(); - } -}; - - class FSkyVertexBuffer : public FVertexBuffer, public FSkyDomeCreator { diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/gl/renderer/gl_postprocess.cpp index 2a1ec74e5..737c6d6ce 100644 --- a/src/gl/renderer/gl_postprocess.cpp +++ b/src/gl/renderer/gl_postprocess.cpp @@ -54,7 +54,7 @@ void FGLRenderer::RenderScreenQuad() { mVBO->Bind(gl_RenderState); gl_RenderState.ApplyBuffers(); - glDrawArrays(GL_TRIANGLE_STRIP, FGLFlatVertexBuffer::PRESENT_INDEX, 4); + glDrawArrays(GL_TRIANGLE_STRIP, FFlatVertexBuffer::PRESENT_INDEX, 4); } void FGLRenderer::PostProcessScene(int fixedcm, const std::function &afterBloomDrawEndScene2D) diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index 9bd70b43c..1d43e1fb4 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -99,7 +99,7 @@ void FGLRenderer::Initialize(int width, int height) glBindVertexArray(mVAOID); FGLDebug::LabelObject(GL_VERTEX_ARRAY, mVAOID, "FGLRenderer.mVAOID"); - mVBO = new FGLFlatVertexBuffer(width, height); + mVBO = new FFlatVertexBuffer(width, height); mSkyVBO = new FSkyVertexBuffer; mLights = new FLightBuffer(); mViewpoints = new GLViewpointBuffer; diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index bc3e1a217..66da27cd7 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -16,7 +16,7 @@ struct particle_t; class FCanvasTexture; -class FGLFlatVertexBuffer; +class FFlatVertexBuffer; class FSkyVertexBuffer; class OpenGLFrameBuffer; struct FDrawInfo; @@ -69,7 +69,7 @@ public: //FRotator mAngles; - FGLFlatVertexBuffer *mVBO = nullptr; + FFlatVertexBuffer *mVBO = nullptr; FSkyVertexBuffer *mSkyVBO = nullptr; FLightBuffer *mLights = nullptr; GLViewpointBuffer *mViewpoints = nullptr; diff --git a/src/gl/scene/gl_drawinfo.cpp b/src/gl/scene/gl_drawinfo.cpp index a723e80ea..c7eda62f6 100644 --- a/src/gl/scene/gl_drawinfo.cpp +++ b/src/gl/scene/gl_drawinfo.cpp @@ -319,7 +319,7 @@ void FDrawInfo::ClearScreen() glDisable(GL_MULTISAMPLE); glDisable(GL_DEPTH_TEST); - glDrawArrays(GL_TRIANGLE_STRIP, FGLFlatVertexBuffer::FULLSCREEN_INDEX, 4); + glDrawArrays(GL_TRIANGLE_STRIP, FFlatVertexBuffer::FULLSCREEN_INDEX, 4); glEnable(GL_DEPTH_TEST); if (multi) glEnable(GL_MULTISAMPLE); diff --git a/src/gl/shaders/gl_shader.h b/src/gl/shaders/gl_shader.h index 2c137b5aa..7e6b81450 100644 --- a/src/gl/shaders/gl_shader.h +++ b/src/gl/shaders/gl_shader.h @@ -28,15 +28,6 @@ extern bool gl_shaderactive; -enum -{ - VATTR_VERTEX = 0, - VATTR_TEXCOORD = 1, - VATTR_COLOR = 2, - VATTR_VERTEX2 = 3, - VATTR_NORMAL = 4 -}; - class FShaderCollection; struct HWViewpointUniforms; diff --git a/src/hwrenderer/data/flatvertices.cpp b/src/hwrenderer/data/flatvertices.cpp index fd034b4ba..022c1d106 100644 --- a/src/hwrenderer/data/flatvertices.cpp +++ b/src/hwrenderer/data/flatvertices.cpp @@ -31,6 +31,9 @@ #include "c_cvars.h" #include "g_levellocals.h" #include "flatvertices.h" +#include "cmdlib.h" +#include "hwrenderer/data/vertexbuffer.h" +#include "hwrenderer/scene/hw_renderstate.h" //========================================================================== @@ -71,14 +74,51 @@ FFlatVertexBuffer::FFlatVertexBuffer(int width, int height) vbo_shadowdata[17].Set(-32767.0f, -32767.0f, 32767.0f, 0, 0); vbo_shadowdata[18].Set(32767.0f, -32767.0f, 32767.0f, 0, 0); vbo_shadowdata[19].Set(32767.0f, -32767.0f, -32767.0f, 0, 0); + + mVertexBuffer = screen->CreateVertexBuffer(); + mIndexBuffer = screen->CreateIndexBuffer(); + + unsigned int bytesize = BUFFER_SIZE * sizeof(FFlatVertex); + mVertexBuffer->SetData(bytesize, nullptr, false); + + static const FVertexBufferAttribute format[] = { + { 0, VATTR_VERTEX, VFmt_Float3, myoffsetof(FFlatVertex, x) }, + { 0, VATTR_TEXCOORD, VFmt_Float2, myoffsetof(FFlatVertex, u) } + }; + mVertexBuffer->SetFormat(1, 2, sizeof(FFlatVertex), format); + + mIndex = mCurIndex = 0; + mNumReserved = NUM_RESERVED; + Copy(0, NUM_RESERVED); } +//========================================================================== +// +// +// +//========================================================================== + +FFlatVertexBuffer::~FFlatVertexBuffer() +{ + delete mIndexBuffer; + delete mVertexBuffer; + mIndexBuffer = nullptr; + mVertexBuffer = nullptr; +} + +//========================================================================== +// +// +// +//========================================================================== + void FFlatVertexBuffer::OutputResized(int width, int height) { vbo_shadowdata[4].Set(0, 0, 0, 0, 0); vbo_shadowdata[5].Set(0, (float)height, 0, 0, 1); vbo_shadowdata[6].Set((float)width, 0, 0, 1, 0); vbo_shadowdata[7].Set((float)width, (float)height, 0, 1, 1); + Copy(4, 4); } //========================================================================== @@ -276,7 +316,7 @@ void FFlatVertexBuffer::UpdatePlaneVertices(sector_t *sec, int plane) int countvt = sec->vbocount[plane]; secplane_t &splane = sec->GetSecPlane(plane); FFlatVertex *vt = &vbo_shadowdata[startvt]; - FFlatVertex *mapvt = &mMap[startvt]; + FFlatVertex *mapvt = GetBuffer(startvt); for(int i=0; iz = (float)splane.ZatPoint(vt->x, vt->y); @@ -332,3 +372,43 @@ void FFlatVertexBuffer::CheckUpdate(sector_t *sector) for (unsigned i = 0; i < sector->e->XFloor.ffloors.Size(); i++) CheckPlanes(sector->e->XFloor.ffloors[i]->model); } + +//========================================================================== +// +// +// +//========================================================================== + +void FFlatVertexBuffer::Copy(int start, int count) +{ + Map(); + memcpy(GetBuffer(start), &vbo_shadowdata[0], count * sizeof(FFlatVertex)); + Unmap(); +} + +//========================================================================== +// +// +// +//========================================================================== + +void FFlatVertexBuffer::Bind(FRenderState &state) +{ + state.SetVertexBuffer(mVertexBuffer, 0, 0); + state.SetIndexBuffer(mIndexBuffer); +} + +//========================================================================== +// +// +// +//========================================================================== + +void FFlatVertexBuffer::CreateVBO() +{ + vbo_shadowdata.Resize(mNumReserved); + FFlatVertexBuffer::CreateVertices(); + mCurIndex = mIndex = vbo_shadowdata.Size(); + Copy(0, mIndex); + mIndexBuffer->SetData(ibo_data.Size() * sizeof(uint32_t), &ibo_data[0]); +} diff --git a/src/hwrenderer/data/flatvertices.h b/src/hwrenderer/data/flatvertices.h index 4e907e911..58f1b8739 100644 --- a/src/hwrenderer/data/flatvertices.h +++ b/src/hwrenderer/data/flatvertices.h @@ -24,6 +24,11 @@ #define _HW__VERTEXBUFFER_H #include "tarray.h" +#include "hwrenderer/data/vertexbuffer.h" +#include +#include + +class FRenderState; struct FFlatVertex { @@ -43,10 +48,21 @@ struct FFlatVertex class FFlatVertexBuffer { -protected: TArray vbo_shadowdata; TArray ibo_data; - FFlatVertex *mMap; + + IVertexBuffer *mVertexBuffer; + IIndexBuffer *mIndexBuffer; + + unsigned int mIndex; + std::atomic mCurIndex; + std::mutex mBufferMutex; + unsigned int mNumReserved; + + + static const unsigned int BUFFER_SIZE = 2000000; + static const unsigned int BUFFER_SIZE_TO_USE = 1999500; + // Temporary data for creating an indexed buffer struct FIndexGenerationInfo @@ -85,8 +101,56 @@ public: }; FFlatVertexBuffer(int width, int height); + ~FFlatVertexBuffer(); void OutputResized(int width, int height); + void Bind(FRenderState &state); + void CreateVBO(); + void Copy(int start, int count); + + FFlatVertex *GetBuffer(int index) const + { + FFlatVertex *ff = (FFlatVertex*)mVertexBuffer->Memory(); + return &ff[index]; + } + + FFlatVertex *GetBuffer() const + { + return GetBuffer(mCurIndex); + } + + template + FFlatVertex *Alloc(int num, T *poffset) + { + again: + FFlatVertex *p = GetBuffer(); + auto index = mCurIndex.fetch_add(num); + *poffset = static_cast(index); + if (index + num >= BUFFER_SIZE_TO_USE) + { + std::lock_guard lock(mBufferMutex); + if (mCurIndex >= BUFFER_SIZE_TO_USE) // retest condition, in case another thread got here first + mCurIndex = mIndex; + + if (index >= BUFFER_SIZE_TO_USE) goto again; + } + return p; + } + + void Reset() + { + mCurIndex = mIndex; + } + + void Map() + { + mVertexBuffer->Map(); + } + + void Unmap() + { + mVertexBuffer->Unmap(); + } private: int CreateIndexedSubsectorVertices(subsector_t *sub, const secplane_t &plane, int floor, int vi, FIndexGenerationInfo &gen); diff --git a/src/hwrenderer/data/vertexbuffer.h b/src/hwrenderer/data/vertexbuffer.h index 3b2392dc8..104455a14 100644 --- a/src/hwrenderer/data/vertexbuffer.h +++ b/src/hwrenderer/data/vertexbuffer.h @@ -5,12 +5,12 @@ // VAOs are mostly useless for this because they lump buffer and binding state together which the model code does not want. enum { - VATTR_VERTEX_BIT, - VATTR_TEXCOORD_BIT, - VATTR_COLOR_BIT, - VATTR_VERTEX2_BIT, - VATTR_NORMAL_BIT, - VATTR_NORMAL2_BIT, + VATTR_VERTEX, + VATTR_TEXCOORD, + VATTR_COLOR, + VATTR_VERTEX2, + VATTR_NORMAL, + VATTR_NORMAL2, VATTR_MAX };