1 // Created by: Kirill GAVRILOV
2 // Copyright (c) 2013-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <OpenGl_TextureBufferArb.hxx>
17 #include <OpenGl_Context.hxx>
18 #include <Standard_Assert.hxx>
21 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_TextureBufferArb,OpenGl_VertexBuffer)
23 // =======================================================================
24 // function : OpenGl_TextureBufferArb
26 // =======================================================================
27 OpenGl_TextureBufferArb::OpenGl_TextureBufferArb()
28 : OpenGl_VertexBuffer(),
29 myTextureId (NO_TEXTURE),
30 myTexFormat (GL_RGBA32F)
35 // =======================================================================
36 // function : ~OpenGl_TextureBufferArb
38 // =======================================================================
39 OpenGl_TextureBufferArb::~OpenGl_TextureBufferArb()
44 // =======================================================================
45 // function : GetTarget
47 // =======================================================================
48 GLenum OpenGl_TextureBufferArb::GetTarget() const
50 return GL_TEXTURE_BUFFER; // GL_TEXTURE_BUFFER for OpenGL 3.1+, OpenGL ES 3.2
53 // =======================================================================
56 // =======================================================================
57 void OpenGl_TextureBufferArb::Release (OpenGl_Context* theGlCtx)
59 if (myTextureId != NO_TEXTURE)
61 // application can not handle this case by exception - this is bug in code
62 Standard_ASSERT_RETURN (theGlCtx != NULL,
63 "OpenGl_TextureBufferExt destroyed without GL context! Possible GPU memory leakage...",);
65 if (theGlCtx->IsValid())
67 glDeleteTextures (1, &myTextureId);
69 myTextureId = NO_TEXTURE;
71 OpenGl_VertexBuffer::Release (theGlCtx);
74 // =======================================================================
77 // =======================================================================
78 bool OpenGl_TextureBufferArb::Create (const Handle(OpenGl_Context)& theGlCtx)
80 if (!OpenGl_VertexBuffer::Create (theGlCtx))
85 if (myTextureId == NO_TEXTURE)
87 glGenTextures (1, &myTextureId);
89 return myTextureId != NO_TEXTURE;
92 // =======================================================================
95 // =======================================================================
96 bool OpenGl_TextureBufferArb::Init (const Handle(OpenGl_Context)& theGlCtx,
97 const GLuint theComponentsNb,
98 const GLsizei theElemsNb,
99 const GLfloat* theData)
101 if (theGlCtx->arbTBO == NULL)
105 else if (theComponentsNb < 1
106 || theComponentsNb > 4)
108 // unsupported format
111 else if (theComponentsNb == 3
112 && !theGlCtx->arbTboRGB32)
116 else if (!Create (theGlCtx)
117 || !OpenGl_VertexBuffer::Init (theGlCtx, theComponentsNb, theElemsNb, theData))
122 switch (theComponentsNb)
124 case 1: myTexFormat = GL_R32F; break;
125 case 2: myTexFormat = GL_RG32F; break;
126 case 3: myTexFormat = GL_RGB32F; break; // GL_ARB_texture_buffer_object_rgb32
127 case 4: myTexFormat = GL_RGBA32F; break;
131 BindTexture (theGlCtx, Graphic3d_TextureUnit_0);
132 theGlCtx->arbTBO->glTexBuffer (GetTarget(), myTexFormat, myBufferId);
133 UnbindTexture(theGlCtx, Graphic3d_TextureUnit_0);
138 // =======================================================================
141 // =======================================================================
142 bool OpenGl_TextureBufferArb::Init (const Handle(OpenGl_Context)& theGlCtx,
143 const GLuint theComponentsNb,
144 const GLsizei theElemsNb,
145 const GLuint* theData)
147 if (theGlCtx->arbTBO == NULL)
151 else if (theComponentsNb < 1
152 || theComponentsNb > 4)
154 // unsupported format
157 else if (theComponentsNb == 3
158 && !theGlCtx->arbTboRGB32)
162 else if (!Create (theGlCtx)
163 || !OpenGl_VertexBuffer::Init (theGlCtx, theComponentsNb, theElemsNb, theData))
168 switch (theComponentsNb)
170 case 1: myTexFormat = GL_R32I; break;
171 case 2: myTexFormat = GL_RG32I; break;
172 case 3: myTexFormat = GL_RGB32I; break;
173 case 4: myTexFormat = GL_RGBA32I; break;
177 BindTexture (theGlCtx, Graphic3d_TextureUnit_0);
178 theGlCtx->arbTBO->glTexBuffer (GetTarget(), myTexFormat, myBufferId);
179 UnbindTexture(theGlCtx, Graphic3d_TextureUnit_0);
184 // =======================================================================
187 // =======================================================================
188 bool OpenGl_TextureBufferArb::Init (const Handle(OpenGl_Context)& theGlCtx,
189 const GLuint theComponentsNb,
190 const GLsizei theElemsNb,
191 const GLushort* theData)
193 if (theGlCtx->arbTBO == NULL)
197 else if (theComponentsNb < 1
198 || theComponentsNb > 4)
200 // unsupported format
203 else if (!Create (theGlCtx)
204 || !OpenGl_VertexBuffer::Init (theGlCtx, theComponentsNb, theElemsNb, theData))
209 switch (theComponentsNb)
211 case 1: myTexFormat = GL_R16I; break;
212 case 2: myTexFormat = GL_RG16I; break;
213 case 3: myTexFormat = GL_RGB16I; break;
214 case 4: myTexFormat = GL_RGBA16I; break;
218 BindTexture (theGlCtx, Graphic3d_TextureUnit_0);
219 theGlCtx->arbTBO->glTexBuffer (GetTarget(), myTexFormat, myBufferId);
220 UnbindTexture(theGlCtx, Graphic3d_TextureUnit_0);
225 // =======================================================================
228 // =======================================================================
229 bool OpenGl_TextureBufferArb::Init (const Handle(OpenGl_Context)& theGlCtx,
230 const GLuint theComponentsNb,
231 const GLsizei theElemsNb,
232 const GLubyte* theData)
234 if (theGlCtx->arbTBO == NULL)
238 else if (theComponentsNb < 1
239 || theComponentsNb > 4)
241 // unsupported format
244 else if (!Create (theGlCtx)
245 || !OpenGl_VertexBuffer::Init (theGlCtx, theComponentsNb, theElemsNb, theData))
250 switch (theComponentsNb)
252 case 1: myTexFormat = GL_R8; break;
253 case 2: myTexFormat = GL_RG8; break;
254 case 3: myTexFormat = GL_RGB8; break;
255 case 4: myTexFormat = GL_RGBA8; break;
259 BindTexture (theGlCtx, Graphic3d_TextureUnit_0);
260 theGlCtx->arbTBO->glTexBuffer (GetTarget(), myTexFormat, myBufferId);
261 UnbindTexture(theGlCtx, Graphic3d_TextureUnit_0);
266 // =======================================================================
267 // function : BindTexture
269 // =======================================================================
270 void OpenGl_TextureBufferArb::BindTexture (const Handle(OpenGl_Context)& theGlCtx,
271 const Graphic3d_TextureUnit theTextureUnit) const
273 theGlCtx->core20fwd->glActiveTexture (GL_TEXTURE0 + theTextureUnit);
274 glBindTexture (GetTarget(), myTextureId);
277 // =======================================================================
278 // function : UnbindTexture
280 // =======================================================================
281 void OpenGl_TextureBufferArb::UnbindTexture (const Handle(OpenGl_Context)& theGlCtx,
282 const Graphic3d_TextureUnit theTextureUnit) const
284 theGlCtx->core20fwd->glActiveTexture (GL_TEXTURE0 + theTextureUnit);
285 glBindTexture (GetTarget(), NO_TEXTURE);