0024001: Stereographic rendering support
[occt.git] / src / OpenGl / OpenGl_TextureBufferArb.cxx
CommitLineData
5e27df78 1// Created by: Kirill GAVRILOV
973c2be1 2// Copyright (c) 2014 OPEN CASCADE SAS
5e27df78 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
5e27df78 5//
973c2be1 6// This library is free software; you can redistribute it and / or modify it
7// under the terms of the GNU Lesser General Public 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.
5e27df78 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
5e27df78 14
15#include <OpenGl_TextureBufferArb.hxx>
16
17#include <OpenGl_Context.hxx>
18#include <Standard_Assert.hxx>
19
20IMPLEMENT_STANDARD_HANDLE (OpenGl_TextureBufferArb, OpenGl_VertexBuffer)
21IMPLEMENT_STANDARD_RTTIEXT(OpenGl_TextureBufferArb, OpenGl_VertexBuffer)
22
23// =======================================================================
24// function : OpenGl_TextureBufferArb
25// purpose :
26// =======================================================================
27OpenGl_TextureBufferArb::OpenGl_TextureBufferArb()
28: OpenGl_VertexBuffer(),
29 myTextureId (NO_TEXTURE),
30 myTexFormat (GL_RGBA32F)
31{
32 //
33}
34
35// =======================================================================
36// function : ~OpenGl_TextureBufferArb
37// purpose :
38// =======================================================================
39OpenGl_TextureBufferArb::~OpenGl_TextureBufferArb()
40{
41 Release (NULL);
42}
43
44// =======================================================================
45// function : GetTarget
46// purpose :
47// =======================================================================
48GLenum OpenGl_TextureBufferArb::GetTarget() const
49{
50 return GL_TEXTURE_BUFFER_ARB; // GL_TEXTURE_BUFFER for OpenGL 3.1+
51}
52
53// =======================================================================
54// function : Release
55// purpose :
56// =======================================================================
57void OpenGl_TextureBufferArb::Release (const OpenGl_Context* theGlCtx)
58{
59 if (myTextureId != NO_TEXTURE)
60 {
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...",);
64
fd4a6963 65 if (theGlCtx->IsValid())
66 {
67 glDeleteTextures (1, &myTextureId);
68 }
5e27df78 69 myTextureId = NO_TEXTURE;
70 }
71 OpenGl_VertexBuffer::Release (theGlCtx);
72}
73
74// =======================================================================
75// function : Create
76// purpose :
77// =======================================================================
78bool OpenGl_TextureBufferArb::Create (const Handle(OpenGl_Context)& theGlCtx)
79{
80 if (!OpenGl_VertexBuffer::Create (theGlCtx))
81 {
82 return false;
83 }
84
85 if (myTextureId == NO_TEXTURE)
86 {
87 glGenTextures (1, &myTextureId);
88 }
89 return myTextureId != NO_TEXTURE;
90}
91
92// =======================================================================
93// function : Init
94// purpose :
95// =======================================================================
96bool OpenGl_TextureBufferArb::Init (const Handle(OpenGl_Context)& theGlCtx,
97 const GLuint theComponentsNb,
98 const GLsizei theElemsNb,
99 const GLfloat* theData)
100{
101 if (theComponentsNb != 1
102 && theComponentsNb != 2
103 && theComponentsNb != 4)
104 {
105 // unsupported format
106 return false;
107 }
108 else if (!Create (theGlCtx)
109 || !OpenGl_VertexBuffer::Init (theGlCtx, theComponentsNb, theElemsNb, theData))
110 {
111 return false;
112 }
113
114 switch (theComponentsNb)
115 {
116 case 1: myTexFormat = GL_R32F; break;
117 case 2: myTexFormat = GL_RG32F; break;
118 //case 3: myTexFormat = GL_RGB32F; break; // GL_ARB_texture_buffer_object_rgb32
119 case 4: myTexFormat = GL_RGBA32F; break;
120 }
121
122 Bind (theGlCtx);
123 BindTexture (theGlCtx);
124 theGlCtx->arbTBO->glTexBufferARB (GetTarget(), myTexFormat, myBufferId);
125 UnbindTexture (theGlCtx);
126 Unbind (theGlCtx);
127 return true;
128}
129
130// =======================================================================
131// function : BindTexture
132// purpose :
133// =======================================================================
134void OpenGl_TextureBufferArb::BindTexture (const Handle(OpenGl_Context)& theGlCtx,
135 const GLenum theTextureUnit) const
136{
137 theGlCtx->core20->glActiveTexture (theTextureUnit);
138 glBindTexture (GetTarget(), myTextureId);
139}
140
141// =======================================================================
142// function : UnbindTexture
143// purpose :
144// =======================================================================
145void OpenGl_TextureBufferArb::UnbindTexture (const Handle(OpenGl_Context)& theGlCtx,
146 const GLenum theTextureUnit) const
147{
148 theGlCtx->core20->glActiveTexture (theTextureUnit);
149 glBindTexture (GetTarget(), NO_TEXTURE);
150}