Remove the reserved vbo_shadowdata so only hw_vertexbuffer still needs it

This commit is contained in:
Magnus Norddahl 2023-05-07 00:49:54 +02:00 committed by Christoph Oelckers
parent 2c9a1cbab7
commit c43cef96d1
8 changed files with 32 additions and 80 deletions

View file

@ -48,37 +48,6 @@
FFlatVertexBuffer::FFlatVertexBuffer(DFrameBuffer* fb, int width, int height, int pipelineNbr) : fb(fb), mPipelineNbr(pipelineNbr) FFlatVertexBuffer::FFlatVertexBuffer(DFrameBuffer* fb, int width, int height, int pipelineNbr) : fb(fb), mPipelineNbr(pipelineNbr)
{ {
vbo_shadowdata.Resize(NUM_RESERVED);
// the first quad is reserved for handling coordinates through uniforms.
vbo_shadowdata[0].Set(0, 0, 0, 0, 0);
vbo_shadowdata[1].Set(1, 0, 0, 0, 0);
vbo_shadowdata[2].Set(2, 0, 0, 0, 0);
vbo_shadowdata[3].Set(3, 0, 0, 0, 0);
// and the second one for the fullscreen quad used for blend overlays.
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);
// and this is for the postprocessing copy operation
vbo_shadowdata[8].Set(-1.0f, -1.0f, 0, 0.0f, 0.0f);
vbo_shadowdata[9].Set(3.0f, -1.0f, 0, 2.f, 0.0f);
vbo_shadowdata[10].Set(-1.0f, 3.0f, 0, 0.0f, 2.f);
vbo_shadowdata[11].Set(3.0f, 3.0f, 0, 2.f, 2.f); // Note: not used anymore
// The next two are the stencil caps.
vbo_shadowdata[12].Set(-32767.0f, 32767.0f, -32767.0f, 0, 0);
vbo_shadowdata[13].Set(-32767.0f, 32767.0f, 32767.0f, 0, 0);
vbo_shadowdata[14].Set(32767.0f, 32767.0f, 32767.0f, 0, 0);
vbo_shadowdata[15].Set(32767.0f, 32767.0f, -32767.0f, 0, 0);
vbo_shadowdata[16].Set(-32767.0f, -32767.0f, -32767.0f, 0, 0);
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);
mIndexBuffer = fb->CreateIndexBuffer(); mIndexBuffer = fb->CreateIndexBuffer();
int data[4] = {}; int data[4] = {};
mIndexBuffer->SetData(4, data, BufferUsageType::Static); // On Vulkan this may not be empty, so set some dummy defaults to avoid crashes. mIndexBuffer->SetData(4, data, BufferUsageType::Static); // On Vulkan this may not be empty, so set some dummy defaults to avoid crashes.
@ -99,9 +68,7 @@ FFlatVertexBuffer::FFlatVertexBuffer(DFrameBuffer* fb, int width, int height, in
mVertexBuffer = mVertexBufferPipeline[mPipelinePos]; mVertexBuffer = mVertexBufferPipeline[mPipelinePos];
mIndex = mCurIndex = NUM_RESERVED; mIndex = mCurIndex = 0;
mNumReserved = NUM_RESERVED;
Copy(0, NUM_RESERVED);
} }
//========================================================================== //==========================================================================
@ -128,21 +95,6 @@ FFlatVertexBuffer::~FFlatVertexBuffer()
// //
//========================================================================== //==========================================================================
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);
}
//==========================================================================
//
//
//
//==========================================================================
std::pair<FFlatVertex *, unsigned int> FFlatVertexBuffer::AllocVertices(unsigned int count) std::pair<FFlatVertex *, unsigned int> FFlatVertexBuffer::AllocVertices(unsigned int count)
{ {
FFlatVertex *p = GetBuffer(); FFlatVertex *p = GetBuffer();
@ -169,7 +121,7 @@ void FFlatVertexBuffer::Copy(int start, int count)
{ {
mVertexBuffer = mVertexBufferPipeline[n]; mVertexBuffer = mVertexBufferPipeline[n];
Map(); Map();
memcpy(GetBuffer(start), &vbo_shadowdata[0], count * sizeof(FFlatVertex)); memcpy(GetBuffer(start), vbo_shadowdata.Data(), count * sizeof(FFlatVertex));
Unmap(); Unmap();
mVertexBuffer->Upload(start * sizeof(FFlatVertex), count * sizeof(FFlatVertex)); mVertexBuffer->Upload(start * sizeof(FFlatVertex), count * sizeof(FFlatVertex));
} }

View file

@ -73,7 +73,6 @@ public:
unsigned int mIndex; unsigned int mIndex;
std::atomic<unsigned int> mCurIndex; std::atomic<unsigned int> mCurIndex;
unsigned int mNumReserved;
unsigned int mMapStart; unsigned int mMapStart;
@ -81,21 +80,9 @@ public:
static const unsigned int BUFFER_SIZE_TO_USE = BUFFER_SIZE-500; static const unsigned int BUFFER_SIZE_TO_USE = BUFFER_SIZE-500;
public: public:
enum
{
QUAD_INDEX = 0,
FULLSCREEN_INDEX = 4,
PRESENT_INDEX = 8,
STENCILTOP_INDEX = 12,
STENCILBOTTOM_INDEX = 16,
NUM_RESERVED = 20
};
FFlatVertexBuffer(DFrameBuffer* fb, int width, int height, int pipelineNbr = 1); FFlatVertexBuffer(DFrameBuffer* fb, int width, int height, int pipelineNbr = 1);
~FFlatVertexBuffer(); ~FFlatVertexBuffer();
void OutputResized(int width, int height);
std::pair<IBuffer*, IBuffer*> GetBufferObjects() const std::pair<IBuffer*, IBuffer*> GetBufferObjects() const
{ {
return std::make_pair(mVertexBuffer, mIndexBuffer); return std::make_pair(mVertexBuffer, mIndexBuffer);

View file

@ -103,7 +103,6 @@ void DFrameBuffer::Update()
{ {
SetVirtualSize(clientWidth, clientHeight); SetVirtualSize(clientWidth, clientHeight);
V_OutputResized(clientWidth, clientHeight); V_OutputResized(clientWidth, clientHeight);
mVertexData->OutputResized(clientWidth, clientHeight);
} }
} }

View file

@ -366,9 +366,6 @@ void VkPPRenderPassSetup::CreatePipeline(const VkPPRenderPassKey& key)
builder.AddVertexShader(key.Shader->VertexShader.get()); builder.AddVertexShader(key.Shader->VertexShader.get());
builder.AddFragmentShader(key.Shader->FragmentShader.get()); builder.AddFragmentShader(key.Shader->FragmentShader.get());
builder.AddVertexBufferBinding(0, sizeof(FFlatVertex));
builder.AddVertexAttribute(0, 0, VK_FORMAT_R32G32B32_SFLOAT, offsetof(FFlatVertex, x));
builder.AddVertexAttribute(1, 0, VK_FORMAT_R32G32_SFLOAT, offsetof(FFlatVertex, u));
builder.AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT); builder.AddDynamicState(VK_DYNAMIC_STATE_VIEWPORT);
builder.AddDynamicState(VK_DYNAMIC_STATE_SCISSOR); builder.AddDynamicState(VK_DYNAMIC_STATE_SCISSOR);
// Note: the actual values are ignored since we use dynamic viewport+scissor states // Note: the actual values are ignored since we use dynamic viewport+scissor states

View file

@ -122,18 +122,14 @@ void VkPPRenderState::RenderScreenQuad(VkPPRenderPassSetup *passSetup, VulkanDes
.AddClearColor(0.0f, 0.0f, 0.0f, 1.0f) .AddClearColor(0.0f, 0.0f, 0.0f, 1.0f)
.Execute(cmdbuffer); .Execute(cmdbuffer);
VkBuffer vertexBuffers[] = { static_cast<VkHardwareVertexBuffer*>(screen->mVertexData->GetBufferObjects().first)->mBuffer->buffer };
VkDeviceSize offsets[] = { 0 };
cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, passSetup->Pipeline.get()); cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, passSetup->Pipeline.get());
cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passSetup->PipelineLayout.get(), 0, descriptorSet); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passSetup->PipelineLayout.get(), 0, descriptorSet);
cmdbuffer->bindVertexBuffers(0, 1, vertexBuffers, offsets);
cmdbuffer->setViewport(0, 1, &viewport); cmdbuffer->setViewport(0, 1, &viewport);
cmdbuffer->setScissor(0, 1, &scissor); cmdbuffer->setScissor(0, 1, &scissor);
if (stencilTest) if (stencilTest)
cmdbuffer->setStencilReference(VK_STENCIL_FRONT_AND_BACK, screen->stencilValue); cmdbuffer->setStencilReference(VK_STENCIL_FRONT_AND_BACK, screen->stencilValue);
if (pushConstantsSize > 0) if (pushConstantsSize > 0)
cmdbuffer->pushConstants(passSetup->PipelineLayout.get(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, pushConstantsSize, pushConstants); cmdbuffer->pushConstants(passSetup->PipelineLayout.get(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, pushConstantsSize, pushConstants);
cmdbuffer->draw(3, 1, FFlatVertexBuffer::PRESENT_INDEX, 0); cmdbuffer->draw(3, 1, 0, 0);
cmdbuffer->endRenderPass(); cmdbuffer->endRenderPass();
} }

View file

@ -51,10 +51,21 @@ VkRenderState::VkRenderState(VulkanRenderDevice* fb) : fb(fb), mStreamBufferWrit
void VkRenderState::ClearScreen() void VkRenderState::ClearScreen()
{ {
Set2DViewpoint(SCREENWIDTH, SCREENHEIGHT); int width = fb->GetWidth();
int height = fb->GetHeight();
auto vertices = AllocVertices(4);
FFlatVertex* v = vertices.first;
v[0].Set(0, 0, 0, 0, 0);
v[1].Set(0, (float)height, 0, 0, 1);
v[2].Set((float)width, 0, 0, 1, 0);
v[3].Set((float)width, (float)height, 0, 1, 1);
Set2DViewpoint(width, height);
SetColor(0, 0, 0); SetColor(0, 0, 0);
Apply(DT_TriangleStrip); Apply(DT_TriangleStrip);
mCommandBuffer->draw(4, 1, FFlatVertexBuffer::FULLSCREEN_INDEX, 0);
mCommandBuffer->draw(4, 1, vertices.second, 0);
} }
void VkRenderState::Draw(int dt, int index, int count, bool apply) void VkRenderState::Draw(int dt, int index, int count, bool apply)

View file

@ -441,7 +441,7 @@ static void UpdatePlaneVertices(FFlatVertexBuffer *fvb, sector_t* sec, int plane
static void CreateVertices(FFlatVertexBuffer* fvb, TArray<sector_t>& sectors) static void CreateVertices(FFlatVertexBuffer* fvb, TArray<sector_t>& sectors)
{ {
fvb->vbo_shadowdata.Resize(FFlatVertexBuffer::NUM_RESERVED); fvb->vbo_shadowdata.Clear();
CreateIndexedFlatVertices(fvb, sectors); CreateIndexedFlatVertices(fvb, sectors);
} }
@ -489,7 +489,7 @@ void CheckUpdate(FFlatVertexBuffer* fvb, sector_t* sector)
void CreateVBO(FFlatVertexBuffer* fvb, TArray<sector_t>& sectors) void CreateVBO(FFlatVertexBuffer* fvb, TArray<sector_t>& sectors)
{ {
fvb->vbo_shadowdata.Resize(fvb->mNumReserved); fvb->vbo_shadowdata.Clear();
CreateVertices(fvb, sectors); CreateVertices(fvb, sectors);
fvb->mCurIndex = fvb->mIndex = fvb->vbo_shadowdata.Size(); fvb->mCurIndex = fvb->mIndex = fvb->vbo_shadowdata.Size();
fvb->Copy(0, fvb->mIndex); fvb->Copy(0, fvb->mIndex);

View file

@ -1,10 +1,20 @@
layout(location = 0) in vec4 PositionInProjection;
layout(location = 1) in vec2 UV;
layout(location = 0) out vec2 TexCoord; layout(location = 0) out vec2 TexCoord;
vec2 positions[3] = vec2[](
vec2(-1.0, -1.0),
vec2( 3.0, -1.0),
vec2(-1.0, 3.0)
);
vec2 uvs[3] = vec2[](
vec2(0.0, 0.0),
vec2(2.0, 0.0),
vec2(0.0, 2.0)
);
void main() void main()
{ {
gl_Position = PositionInProjection; gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
TexCoord = UV; TexCoord = uvs[gl_VertexIndex];
} }