Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'StreamBuffers'
This branch drops our temporary buffer in VertexLoaderBase.
Instead, every backend now must provide a buffer to convert vertices and indices.
D3D just uses a temporary buffer like before.
OGL maps the gpu based buffer and stream to them directly.
So this will avoid an unneeded memcpy on OGL backend.
  • Loading branch information
degasus committed Jan 23, 2014
2 parents 650bae1 + 1ff681a commit bfd0b72
Show file tree
Hide file tree
Showing 10 changed files with 392 additions and 280 deletions.
12 changes: 12 additions & 0 deletions Source/Core/VideoBackends/D3D/VertexManager.cpp
Expand Up @@ -77,6 +77,12 @@ void VertexManager::DestroyDeviceObjects()

VertexManager::VertexManager()
{
LocalVBuffer.resize(MAXVBUFFERSIZE);
s_pCurBufferPointer = s_pBaseBufferPointer = &LocalVBuffer[0];
s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size();

LocalIBuffer.resize(MAXIBUFFERSIZE);

CreateDeviceObjects();
}

Expand Down Expand Up @@ -222,4 +228,10 @@ void VertexManager::vFlush()
g_renderer->RestoreState();
}

void VertexManager::ResetBuffer(u32 stride)
{
s_pCurBufferPointer = s_pBaseBufferPointer;
IndexGenerator::Start(GetIndexBuffer());
}

} // namespace
7 changes: 7 additions & 0 deletions Source/Core/VideoBackends/D3D/VertexManager.h
Expand Up @@ -22,6 +22,10 @@ class VertexManager : public ::VertexManager
void CreateDeviceObjects();
void DestroyDeviceObjects();

protected:
virtual void ResetBuffer(u32 stride);
u16* GetIndexBuffer() { return &LocalIBuffer[0]; }

private:

void PrepareDrawBuffers();
Expand All @@ -41,6 +45,9 @@ class VertexManager : public ::VertexManager

LineGeometryShader m_lineShader;
PointGeometryShader m_pointShader;

std::vector<u8> LocalVBuffer;
std::vector<u16> LocalIBuffer;
};

} // namespace
Expand Down
38 changes: 14 additions & 24 deletions Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
Expand Up @@ -193,29 +193,19 @@ void ProgramShaderCache::UploadConstants()
{
if(PixelShaderManager::dirty || VertexShaderManager::dirty)
{
s_buffer->Alloc(s_ubo_buffer_size);
if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM))
{
// This is just a hack to support our BUFFERDATA upload method
// as it's broken to uploaded in a splited way
static u8 *tmpbuffer = new u8[s_ubo_buffer_size];
memcpy(tmpbuffer, &PixelShaderManager::constants, sizeof(PixelShaderConstants));
memcpy(tmpbuffer+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), &VertexShaderManager::constants, sizeof(VertexShaderConstants));
size_t offset = s_buffer->Upload(tmpbuffer, s_ubo_buffer_size);
glBindBufferRange(GL_UNIFORM_BUFFER, 1,
s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
glBindBufferRange(GL_UNIFORM_BUFFER, 2,
s_buffer->getBuffer(), offset+ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align), sizeof(VertexShaderConstants));
}
else
{
size_t offset = s_buffer->Upload((u8*)&PixelShaderManager::constants, ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align));
glBindBufferRange(GL_UNIFORM_BUFFER, 1,
s_buffer->getBuffer(), offset, sizeof(PixelShaderConstants));
offset = s_buffer->Upload((u8*)&VertexShaderManager::constants, ROUND_UP(sizeof(VertexShaderConstants), s_ubo_align));
glBindBufferRange(GL_UNIFORM_BUFFER, 2,
s_buffer->getBuffer(), offset, sizeof(VertexShaderConstants));
}
auto buffer = s_buffer->Map(s_ubo_buffer_size, s_ubo_align);

memcpy(buffer.first,
&PixelShaderManager::constants, sizeof(PixelShaderConstants));

memcpy(buffer.first + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align),
&VertexShaderManager::constants, sizeof(VertexShaderConstants));

s_buffer->Unmap(s_ubo_buffer_size);
glBindBufferRange(GL_UNIFORM_BUFFER, 1, s_buffer->m_buffer, buffer.second,
sizeof(PixelShaderConstants));
glBindBufferRange(GL_UNIFORM_BUFFER, 2, s_buffer->m_buffer, buffer.second + ROUND_UP(sizeof(PixelShaderConstants), s_ubo_align),
sizeof(VertexShaderConstants));

PixelShaderManager::dirty = false;
VertexShaderManager::dirty = false;
Expand Down Expand Up @@ -481,7 +471,7 @@ void ProgramShaderCache::Init(void)
// We multiply by *4*4 because we need to get down to basic machine units.
// So multiply by four to get how many floats we have from vec4s
// Then once more to get bytes
s_buffer = new StreamBuffer(GL_UNIFORM_BUFFER, UBO_LENGTH);
s_buffer = StreamBuffer::Create(GL_UNIFORM_BUFFER, UBO_LENGTH);
}

// Read our shader cache, only if supported
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/VideoBackends/OGL/Render.cpp
Expand Up @@ -1653,7 +1653,7 @@ void Renderer::RestoreAPIState()

VertexManager *vm = (OGL::VertexManager*)g_vertex_manager;
glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers);
vm->m_last_vao = 0;
glBindVertexArray(vm->m_last_vao);

TextureCache::SetStage();
}
Expand Down

0 comments on commit bfd0b72

Please sign in to comment.