mirror of https://github.com/PCSX2/pcsx2.git
gsdx ogl: replace ClearRenderTarget_i by glClearTexSubImage
Avoid state change, avoid potential texture buffer reallocation Note: require GL_ARB_clear_texture
This commit is contained in:
parent
82060320ef
commit
5b061e062c
|
@ -565,6 +565,9 @@ void GSDeviceOGL::ClearRenderTarget(GSTexture* t, uint32 c)
|
||||||
|
|
||||||
void GSDeviceOGL::ClearRenderTarget_i(GSTexture* t, int32 c)
|
void GSDeviceOGL::ClearRenderTarget_i(GSTexture* t, int32 c)
|
||||||
{
|
{
|
||||||
|
// Hopefully AMD mesa will support this extension soon
|
||||||
|
ASSERT(!GLLoader::found_GL_ARB_clear_texture);
|
||||||
|
|
||||||
if (!t) return;
|
if (!t) return;
|
||||||
|
|
||||||
GSTextureOGL* T = static_cast<GSTextureOGL*>(t);
|
GSTextureOGL* T = static_cast<GSTextureOGL*>(t);
|
||||||
|
@ -715,7 +718,7 @@ GSDepthStencilOGL* GSDeviceOGL::CreateDepthStencil(OMDepthStencilSelector dssel)
|
||||||
return dss;
|
return dss;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDeviceOGL::InitPrimDateTexture(GSTexture* rt)
|
void GSDeviceOGL::InitPrimDateTexture(GSTexture* rt, const GSVector4i& area)
|
||||||
{
|
{
|
||||||
const GSVector2i& rtsize = rt->GetSize();
|
const GSVector2i& rtsize = rt->GetSize();
|
||||||
|
|
||||||
|
@ -724,7 +727,12 @@ void GSDeviceOGL::InitPrimDateTexture(GSTexture* rt)
|
||||||
m_date.t = CreateTexture(rtsize.x, rtsize.y, GL_R32I);
|
m_date.t = CreateTexture(rtsize.x, rtsize.y, GL_R32I);
|
||||||
|
|
||||||
// Clean with the max signed value
|
// Clean with the max signed value
|
||||||
ClearRenderTarget_i(m_date.t, 0x7FFFFFFF);
|
int max_int = 0x7FFFFFFF;
|
||||||
|
if (GLLoader::found_GL_ARB_clear_texture) {
|
||||||
|
static_cast<GSTextureOGL*>(m_date.t)->Clear(&max_int, area);
|
||||||
|
} else {
|
||||||
|
ClearRenderTarget_i(m_date.t, max_int);
|
||||||
|
}
|
||||||
|
|
||||||
glBindImageTexture(2, static_cast<GSTextureOGL*>(m_date.t)->GetID(), 0, false, 0, GL_READ_WRITE, GL_R32I);
|
glBindImageTexture(2, static_cast<GSTextureOGL*>(m_date.t)->GetID(), 0, false, 0, GL_READ_WRITE, GL_R32I);
|
||||||
#ifdef ENABLE_OGL_DEBUG
|
#ifdef ENABLE_OGL_DEBUG
|
||||||
|
|
|
@ -501,7 +501,7 @@ class GSDeviceOGL final : public GSDevice
|
||||||
GSTexture* CreateDepthStencil(int w, int h, bool msaa, int format = 0) final;
|
GSTexture* CreateDepthStencil(int w, int h, bool msaa, int format = 0) final;
|
||||||
GSTexture* CreateTexture(int w, int h, int format = 0) final;
|
GSTexture* CreateTexture(int w, int h, int format = 0) final;
|
||||||
GSTexture* CreateOffscreen(int w, int h, int format = 0) final;
|
GSTexture* CreateOffscreen(int w, int h, int format = 0) final;
|
||||||
void InitPrimDateTexture(GSTexture* rt);
|
void InitPrimDateTexture(GSTexture* rt, const GSVector4i& area);
|
||||||
void RecycleDateTexture();
|
void RecycleDateTexture();
|
||||||
|
|
||||||
GSTexture* CopyOffscreen(GSTexture* src, const GSVector4& sRect, int w, int h, int format = 0, int ps_shader = 0) final;
|
GSTexture* CopyOffscreen(GSTexture* src, const GSVector4& sRect, int w, int h, int format = 0, int ps_shader = 0) final;
|
||||||
|
|
|
@ -858,7 +858,7 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour
|
||||||
// Must be done here to avoid any GL state pertubation (clear function...)
|
// Must be done here to avoid any GL state pertubation (clear function...)
|
||||||
// Create an r32ui image that will containt primitive ID
|
// Create an r32ui image that will containt primitive ID
|
||||||
if (DATE_GL42) {
|
if (DATE_GL42) {
|
||||||
dev->InitPrimDateTexture(rt);
|
dev->InitPrimDateTexture(rt, dRect);
|
||||||
} else {
|
} else {
|
||||||
GSVector4 src = GSVector4(dRect) / GSVector4(rtsize.x, rtsize.y).xyxy();
|
GSVector4 src = GSVector4(dRect) / GSVector4(rtsize.x, rtsize.y).xyxy();
|
||||||
GSVector4 dst = src * 2.0f - 1.0f;
|
GSVector4 dst = src * 2.0f - 1.0f;
|
||||||
|
|
|
@ -293,7 +293,7 @@ void GSTextureOGL::Clear(const void* data)
|
||||||
|
|
||||||
void GSTextureOGL::Clear(const void* data, const GSVector4i& area)
|
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);
|
glClearTexSubImage(m_texture_id, GL_TEX_LEVEL_0, area.x, area.y, 0, area.width(), area.height(), 1, m_int_format, m_int_type, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
bool GSTextureOGL::Update(const GSVector4i& r, const void* data, int pitch)
|
||||||
|
|
Loading…
Reference in New Issue