mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-24 21:01:35 +00:00
- added check for light uniform buffer overflows, because uniform buffers on Intel are rather small.
This commit is contained in:
parent
e35fefdc06
commit
a97b58fa27
1 changed files with 29 additions and 3 deletions
|
@ -52,13 +52,15 @@ FLightBuffer::FLightBuffer()
|
||||||
if (gl.flags & RFL_SHADER_STORAGE_BUFFER)
|
if (gl.flags & RFL_SHADER_STORAGE_BUFFER)
|
||||||
{
|
{
|
||||||
mBufferType = GL_SHADER_STORAGE_BUFFER;
|
mBufferType = GL_SHADER_STORAGE_BUFFER;
|
||||||
mBlockAlign = 0;
|
mBlockAlign = -1;
|
||||||
|
mBlockSize = BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mBufferType = GL_UNIFORM_BUFFER;
|
mBufferType = GL_UNIFORM_BUFFER;
|
||||||
mBlockSize = 2048;// gl.maxuniformblock / 4 - 100;
|
mBlockSize = gl.maxuniformblock / 16;
|
||||||
mBlockAlign = 1024;// ((mBlockSize * 2) & ~(gl.uniformblockalignment - 1)) / 4; // count in vec4's
|
if (mBlockSize > 2048) mBlockSize = 2048; // we don't really need a larger buffer
|
||||||
|
mBlockAlign = mBlockSize / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
glGenBuffers(1, &mBufferId);
|
glGenBuffers(1, &mBufferId);
|
||||||
|
@ -92,6 +94,30 @@ int FLightBuffer::UploadLights(FDynLightData &data)
|
||||||
int size2 = data.arrays[2].Size()/4;
|
int size2 = data.arrays[2].Size()/4;
|
||||||
int totalsize = size0 + size1 + size2 + 1;
|
int totalsize = size0 + size1 + size2 + 1;
|
||||||
|
|
||||||
|
if (mBlockAlign >= 0 && totalsize + (mIndex % mBlockAlign) > mBlockSize)
|
||||||
|
{
|
||||||
|
mIndex = ((mIndex + mBlockAlign) / mBlockAlign) * mBlockAlign;
|
||||||
|
|
||||||
|
// can't be rendered all at once.
|
||||||
|
if (totalsize > mBlockSize)
|
||||||
|
{
|
||||||
|
int diff = totalsize - mBlockSize;
|
||||||
|
|
||||||
|
size2 -= diff;
|
||||||
|
if (size2 < 0)
|
||||||
|
{
|
||||||
|
size1 += size2;
|
||||||
|
size2 = 0;
|
||||||
|
}
|
||||||
|
if (size1 < 0)
|
||||||
|
{
|
||||||
|
size0 += size1;
|
||||||
|
size1 = 0;
|
||||||
|
}
|
||||||
|
totalsize = size0 + size1 + size2 + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (totalsize <= 1) return -1;
|
if (totalsize <= 1) return -1;
|
||||||
|
|
||||||
if (mIndex + totalsize > BUFFER_SIZE)
|
if (mIndex + totalsize > BUFFER_SIZE)
|
||||||
|
|
Loading…
Reference in a new issue