diff --git a/docs/FAQ.aml b/docs/FAQ.aml
index acf77b617..5c9ac9f3c 100644
--- a/docs/FAQ.aml
+++ b/docs/FAQ.aml
@@ -180,8 +180,8 @@
For OpenGL RenderDoc will only capture core profile applications, in general, and expects
- to be able to create a core 4.3 context which includes EXT_direct_state_access. For more
- details see the OpenGL page.
+ to be able to create a core 4.3 context which includes EXT_direct_state_access and ARB_buffer_storage.
+ For more details see the OpenGL page.
diff --git a/docs/OpenGL.aml b/docs/OpenGL.aml
index 93851c68f..da331b90b 100644
--- a/docs/OpenGL.aml
+++ b/docs/OpenGL.aml
@@ -30,7 +30,8 @@
RenderDoc assumes your hardware/software configuration is able to create a core 4.3 context
- for replay, and also that EXT_direct_state_access is available, both on replay and in capture.
+ for replay, and also that EXT_direct_state_access and ARB_buffer_storage are available, both
+ on replay and in capture.
Regarding multiple contexts and multithreading, RenderDoc assumes that all GL commands (with
diff --git a/renderdoc/driver/gl/gl_replay_win32.cpp b/renderdoc/driver/gl/gl_replay_win32.cpp
index c8e8ddc5e..f04fc4eec 100644
--- a/renderdoc/driver/gl/gl_replay_win32.cpp
+++ b/renderdoc/driver/gl/gl_replay_win32.cpp
@@ -428,7 +428,8 @@ ReplayCreateStatus GL_CreateReplayDevice(const char *logfile, IReplayDriver **dr
{
// eventually we want to emulate EXT_dsa on replay if it isn't present, but for
// now we just require it.
- bool found = false;
+ bool dsa = false;
+ bool bufstorage = false;
if(getStr)
RDCLOG("Running GL replay on: %s / %s / %s", getStr(eGL_VENDOR), getStr(eGL_RENDERER), getStr(eGL_VERSION));
@@ -441,15 +442,18 @@ ReplayCreateStatus GL_CreateReplayDevice(const char *logfile, IReplayDriver **dr
RDCLOG("Extension % 3d: %s", e, ext);
- if(!strcmp(ext, "GL_EXT_direct_state_access"))
- {
- found = true;
- }
+ if(!strcmp(ext, "GL_EXT_direct_state_access")) dsa = true;
+ if(!strcmp(ext, "GL_ARB_buffer_storage")) bufstorage = true;
}
- if(!found)
- {
+ if(!dsa)
RDCERR("RenderDoc requires EXT_direct_state_access availability, and it is not reported. Try updating your drivers.");
+
+ if(!bufstorage)
+ RDCERR("RenderDoc requires ARB_buffer_storage availability, and it is not reported. Try updating your drivers.");
+
+ if(!dsa || !bufstorage)
+ {
wglMakeCurrentProc(NULL, NULL);
wglDeleteRC(rc);
ReleaseDC(w, dc);
@@ -483,7 +487,7 @@ ReplayCreateStatus GL_CreateReplayDevice(const char *logfile, IReplayDriver **dr
#define CHECK_PRESENT(func) \
if(!real.func) \
{ \
- RDCERR("Missing function %s, required for replay. RenderDoc requires a 4.3 context and EXT_direct_state_access", #func); \
+ RDCERR("Missing function %s, required for replay. RenderDoc requires a 4.3 context, EXT_direct_state_access and ARB_buffer_storage", #func); \
wglMakeCurrentProc(NULL, NULL); \
wglDeleteRC(rc); \
ReleaseDC(w, dc); \
@@ -721,7 +725,8 @@ CHECK_PRESENT(glViewport)
CHECK_PRESENT(glViewportArrayv)
CHECK_PRESENT(glViewportIndexedf)
-// these functions should be present as part of EXT_direct_state_access, let's verify
+// these functions should be present as part of EXT_direct_state_access,
+// and ARB_buffer_storage. Let's verify
CHECK_PRESENT(glCompressedTextureImage1DEXT)
CHECK_PRESENT(glCompressedTextureImage2DEXT)
CHECK_PRESENT(glCompressedTextureImage3DEXT)
@@ -737,12 +742,11 @@ CHECK_PRESENT(glGetTextureParameterfvEXT)
CHECK_PRESENT(glGetTextureParameterivEXT)
CHECK_PRESENT(glMapNamedBufferEXT)
CHECK_PRESENT(glNamedBufferDataEXT)
-CHECK_PRESENT(glNamedBufferStorageEXT)
+CHECK_PRESENT(glNamedBufferStorageEXT) // needs ARB_buffer_storage as well
CHECK_PRESENT(glNamedBufferSubDataEXT)
CHECK_PRESENT(glNamedFramebufferRenderbufferEXT)
CHECK_PRESENT(glNamedFramebufferTextureEXT)
CHECK_PRESENT(glNamedFramebufferTextureLayerEXT)
-CHECK_PRESENT(glTextureBufferRangeEXT)
CHECK_PRESENT(glTextureImage1DEXT)
CHECK_PRESENT(glTextureImage2DEXT)
CHECK_PRESENT(glTextureImage3DEXT)