2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "FrameBufferObject.h"
11 #include "ServiceBroker.h"
12 #include "rendering/RenderSystem.h"
13 #include "utils/GLUtils.h"
14 #include "utils/log.h"
16 //////////////////////////////////////////////////////////////////////
18 //////////////////////////////////////////////////////////////////////
20 CFrameBufferObject::CFrameBufferObject()
27 bool CFrameBufferObject::IsSupported()
29 if(CServiceBroker::GetRenderSystem()->IsExtSupported("GL_EXT_framebuffer_object"))
36 bool CFrameBufferObject::Initialize()
43 glGenFramebuffers(1, &m_fbo
);
53 void CFrameBufferObject::Cleanup()
59 glDeleteFramebuffers(1, &m_fbo
);
62 glDeleteTextures(1, &m_texid
);
70 bool CFrameBufferObject::CreateAndBindToTexture(GLenum target
, int width
, int height
, GLenum format
, GLenum type
,
71 GLenum filter
, GLenum clampmode
)
77 glDeleteTextures(1, &m_texid
);
79 glGenTextures(1, &m_texid
);
80 glBindTexture(target
, m_texid
);
81 glTexImage2D(target
, 0, format
, width
, height
, 0, GL_RGBA
, type
, NULL
);
82 glTexParameteri(target
, GL_TEXTURE_WRAP_S
, clampmode
);
83 glTexParameteri(target
, GL_TEXTURE_WRAP_T
, clampmode
);
84 glTexParameteri(target
, GL_TEXTURE_MAG_FILTER
, filter
);
85 glTexParameteri(target
, GL_TEXTURE_MIN_FILTER
, filter
);
89 glBindFramebuffer(GL_FRAMEBUFFER
, m_fbo
);
90 glBindTexture(target
, m_texid
);
91 glFramebufferTexture2D(GL_FRAMEBUFFER
, GL_COLOR_ATTACHMENT0
, target
, m_texid
, 0);
93 GLenum status
= glCheckFramebufferStatus(GL_FRAMEBUFFER
);
94 glBindFramebuffer(GL_FRAMEBUFFER
, 0);
95 if (status
!= GL_FRAMEBUFFER_COMPLETE
)
104 void CFrameBufferObject::SetFiltering(GLenum target
, GLenum mode
)
106 glBindTexture(target
, m_texid
);
107 glTexParameteri(target
, GL_TEXTURE_MAG_FILTER
, mode
);
108 glTexParameteri(target
, GL_TEXTURE_MIN_FILTER
, mode
);
111 // Begin rendering to FBO
112 bool CFrameBufferObject::BeginRender()
114 if (IsValid() && IsBound())
116 glBindFramebuffer(GL_FRAMEBUFFER
, m_fbo
);
122 // Finish rendering to FBO
123 void CFrameBufferObject::EndRender() const
126 glBindFramebuffer(GL_FRAMEBUFFER
, 0);