diff --git a/plugins/GSdx/GLLoader.cpp b/plugins/GSdx/GLLoader.cpp index db1f0241a7..dd95b1ece2 100644 --- a/plugins/GSdx/GLLoader.cpp +++ b/plugins/GSdx/GLLoader.cpp @@ -115,6 +115,7 @@ PFNGLBINDIMAGETEXTUREPROC glBindImageTexture = NUL PFNGLMEMORYBARRIERPROC glMemoryBarrier = NULL; // GL4.4 PFNGLCLEARTEXIMAGEPROC glClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC glClearTexSubImage = NULL; PFNGLBUFFERSTORAGEPROC glBufferStorage = NULL; // GL4.5 diff --git a/plugins/GSdx/GLLoader.h b/plugins/GSdx/GLLoader.h index 4ed6f78f0b..f5eb9eec7a 100644 --- a/plugins/GSdx/GLLoader.h +++ b/plugins/GSdx/GLLoader.h @@ -290,6 +290,7 @@ extern PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert; extern PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; // GL4.4 extern PFNGLCLEARTEXIMAGEPROC glClearTexImage; +extern PFNGLCLEARTEXSUBIMAGEPROC glClearTexSubImage; extern PFNGLBUFFERSTORAGEPROC glBufferStorage; // GL4.5 diff --git a/plugins/GSdx/GSTextureOGL.cpp b/plugins/GSdx/GSTextureOGL.cpp index 44ba8b4b86..07dad5e2b1 100644 --- a/plugins/GSdx/GSTextureOGL.cpp +++ b/plugins/GSdx/GSTextureOGL.cpp @@ -223,10 +223,15 @@ GSTextureOGL::GSTextureOGL(int type, int w, int h, int format, GLuint fbo_read) m_int_shift = 3; break; - // Special - case 0: + // Depth buffer case GL_DEPTH32F_STENCIL8: - // Backbuffer & dss aren't important + m_int_format = GL_DEPTH_STENCIL; + m_int_type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV; + m_int_shift = 0; + break; + + // Backbuffer + case 0: m_int_format = 0; m_int_type = 0; m_int_shift = 0; @@ -281,6 +286,16 @@ GSTextureOGL::~GSTextureOGL() _aligned_free(m_local_buffer); } +void GSTextureOGL::Clear(const void* data) +{ + glClearTexImage(m_texture_id, GL_TEX_LEVEL_0, m_int_format, m_int_type, data); +} + +void GSTextureOGL::Clear(const void* data, const GSVector4i& area) +{ + glClearTexSubImage(m_texture_id, area.x, area.y, 0, area.width(), area.height(), 1, GL_TEX_LEVEL_0, m_int_format, m_int_type, data); +} + bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch) { ASSERT(m_type != GSTexture::DepthStencil && m_type != GSTexture::Offscreen); diff --git a/plugins/GSdx/GSTextureOGL.h b/plugins/GSdx/GSTextureOGL.h index f4c5ea20be..047186eb80 100644 --- a/plugins/GSdx/GSTextureOGL.h +++ b/plugins/GSdx/GSTextureOGL.h @@ -77,5 +77,8 @@ class GSTextureOGL final : public GSTexture void WasAttached() { m_clean = false; } void WasCleaned() { m_clean = true; } + void Clear(const void* data); + void Clear(const void* data, const GSVector4i& area); + uint32 GetMemUsage(); }; diff --git a/plugins/GSdx/GSWnd.cpp b/plugins/GSdx/GSWnd.cpp index 03ce7df52f..cdbab2da10 100644 --- a/plugins/GSdx/GSWnd.cpp +++ b/plugins/GSdx/GSWnd.cpp @@ -124,6 +124,7 @@ void GSWndGL::PopulateGlFunction() GL_EXT_LOAD(glDebugMessageCallback); // GL4.4 GL_EXT_LOAD_OPT(glClearTexImage); + GL_EXT_LOAD_OPT(glClearTexSubImage); GL_EXT_LOAD(glBufferStorage); // GL4.5