summaryrefslogtreecommitdiff
path: root/indra/llrender/llrendertarget.cpp
diff options
context:
space:
mode:
authorKitty Barnett <develop@catznip.com>2023-01-02 23:04:02 +0100
committerKitty Barnett <develop@catznip.com>2023-01-02 23:04:42 +0100
commit6850b915fe42f5a75fc9d8bb9ca05f961de3244a (patch)
tree0921b5e0c74a64ad65d1b5702b00142badb6140c /indra/llrender/llrendertarget.cpp
parent89456ec88df01565e2c9a424a0097a5a02e1838c (diff)
parentf3f3c493ec2a658cf5c1aac6670c54c550e944fd (diff)
Merge branch 'master' into texture-preview
Diffstat (limited to 'indra/llrender/llrendertarget.cpp')
-rw-r--r--indra/llrender/llrendertarget.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index e3c0255290..fffc15efc3 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -133,7 +133,7 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
mUsage = usage;
mUseDepth = depth;
- if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
+ if (sUseFBO || use_fbo)
{
if (depth)
{
@@ -170,6 +170,53 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
return addColorAttachment(color_fmt);
}
+void LLRenderTarget::setColorAttachment(LLImageGL* img, LLGLuint use_name)
+{
+ LL_PROFILE_ZONE_SCOPED;
+ llassert(img != nullptr); // img must not be null
+ llassert(sUseFBO); // FBO support must be enabled
+ llassert(mDepth == 0); // depth buffers not supported with this mode
+ llassert(mTex.empty()); // mTex must be empty with this mode (binding target should be done via LLImageGL)
+
+ if (mFBO == 0)
+ {
+ glGenFramebuffers(1, (GLuint*)&mFBO);
+ }
+
+ mResX = img->getWidth();
+ mResY = img->getHeight();
+ mUsage = img->getTarget();
+
+ if (use_name == 0)
+ {
+ use_name = img->getTexName();
+ }
+
+ mTex.push_back(use_name);
+
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ LLTexUnit::getInternalType(mUsage), use_name, 0);
+ stop_glerror();
+
+ check_framebuffer_status();
+
+ glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
+}
+
+void LLRenderTarget::releaseColorAttachment()
+{
+ LL_PROFILE_ZONE_SCOPED;
+ llassert(mTex.size() == 1); //cannot use releaseColorAttachment with LLRenderTarget managed color targets
+ llassert(mFBO != 0); // mFBO must be valid
+
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, LLTexUnit::getInternalType(mUsage), 0, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
+
+ mTex.clear();
+}
+
bool LLRenderTarget::addColorAttachment(U32 color_fmt)
{
if (color_fmt == 0)
@@ -437,11 +484,13 @@ void LLRenderTarget::bindTarget()
GL_COLOR_ATTACHMENT1,
GL_COLOR_ATTACHMENT2,
GL_COLOR_ATTACHMENT3};
+ LL_PROFILER_GPU_ZONEC( "gl.DrawBuffersARB", 0x4000FF )
glDrawBuffersARB(mTex.size(), drawbuffers);
}
if (mTex.empty())
{ //no color buffer to draw to
+ LL_PROFILER_GPU_ZONEC( "gl.DrawBuffer", 0x0000FF )
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
}