mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-10-12 15:19:14 +00:00
Synchronise when doing glMap(UNSYNC) after buffer orphan. Closes #1164
This commit is contained in:
2 files changed
+28
-4
No files matched your search
@@ -236,6 +236,7 @@ struct GLResourceRecord : public ResourceRecord
|
||||
MapStatus status;
|
||||
bool invalidate;
|
||||
bool verifyWrite;
|
||||
bool orphaned;
|
||||
byte *ptr;
|
||||
|
||||
byte *persistentPtr;
|
||||
|
||||
@@ -481,6 +481,10 @@ void WrappedOpenGL::glNamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, cons
|
||||
dummy = new byte[size];
|
||||
memset(dummy, 0xdd, size);
|
||||
data = dummy;
|
||||
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
|
||||
if(record)
|
||||
record->Map.orphaned = true;
|
||||
}
|
||||
|
||||
SERIALISE_TIME_CALL(GL.glNamedBufferStorageEXT(buffer, size, data, flags));
|
||||
@@ -507,6 +511,10 @@ void WrappedOpenGL::glBufferStorage(GLenum target, GLsizeiptr size, const void *
|
||||
dummy = new byte[size];
|
||||
memset(dummy, 0xdd, size);
|
||||
data = dummy;
|
||||
|
||||
GLResourceRecord *record = GetCtxData().m_BufferRecord[BufferIdx(target)];
|
||||
if(record)
|
||||
record->Map.orphaned = true;
|
||||
}
|
||||
|
||||
SERIALISE_TIME_CALL(GL.glBufferStorage(target, size, data, flags));
|
||||
@@ -567,6 +575,10 @@ void WrappedOpenGL::glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const v
|
||||
dummy = new byte[size];
|
||||
memset(dummy, 0xdd, size);
|
||||
data = dummy;
|
||||
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
|
||||
if(record)
|
||||
record->Map.orphaned = true;
|
||||
}
|
||||
|
||||
SERIALISE_TIME_CALL(GL.glNamedBufferDataEXT(buffer, size, data, usage));
|
||||
@@ -590,8 +602,6 @@ void WrappedOpenGL::glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const v
|
||||
{
|
||||
if(data)
|
||||
memcpy(record->GetDataPtr(), data, (size_t)size);
|
||||
else
|
||||
memset(record->GetDataPtr(), 0xbe, (size_t)size);
|
||||
|
||||
SAFE_DELETE_ARRAY(dummy);
|
||||
|
||||
@@ -699,17 +709,21 @@ void WrappedOpenGL::glBufferData(GLenum target, GLsizeiptr size, const void *dat
|
||||
{
|
||||
byte *dummy = NULL;
|
||||
|
||||
size_t idx = BufferIdx(target);
|
||||
|
||||
if(IsCaptureMode(m_State) && data == NULL)
|
||||
{
|
||||
dummy = new byte[size];
|
||||
memset(dummy, 0xdd, size);
|
||||
data = dummy;
|
||||
|
||||
GLResourceRecord *record = GetCtxData().m_BufferRecord[idx];
|
||||
if(record)
|
||||
record->Map.orphaned = true;
|
||||
}
|
||||
|
||||
SERIALISE_TIME_CALL(GL.glBufferData(target, size, data, usage));
|
||||
|
||||
size_t idx = BufferIdx(target);
|
||||
|
||||
if(IsCaptureMode(m_State))
|
||||
{
|
||||
GLResourceRecord *record = GetCtxData().m_BufferRecord[idx];
|
||||
@@ -1882,6 +1896,15 @@ void *WrappedOpenGL::glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GL
|
||||
{
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer));
|
||||
|
||||
// if the buffer was recently orphaned, unset the flag. If the map is unsynchronised then sync
|
||||
// ourselves to allow our dummy upload of uninitialised 0xdddddddd to complete.
|
||||
if(record->Map.orphaned)
|
||||
{
|
||||
if(access & GL_MAP_UNSYNCHRONIZED_BIT)
|
||||
GL.glFinish();
|
||||
record->Map.orphaned = false;
|
||||
}
|
||||
|
||||
bool directMap = false;
|
||||
|
||||
// first check if we've already given up on these buffers
|
||||
|
||||
Reference in new issue
Block a user