Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
CommonGUI
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Frédéric Larue
CommonGUI
Commits
c43ad4fd
Commit
c43ad4fd
authored
Aug 09, 2018
by
Frédéric Larue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gpuAssert function added to the GPU module in order to track possible GL errors in debug mode.
parent
5ffe4bb5
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
275 additions
and
229 deletions
+275
-229
GPU/Alignment.h
GPU/Alignment.h
+1
-1
GPU/FrameBuffer.cpp
GPU/FrameBuffer.cpp
+52
-46
GPU/GPUdefs.h
GPU/GPUdefs.h
+24
-0
GPU/Shader.cpp
GPU/Shader.cpp
+68
-60
GPU/Shader.h
GPU/Shader.h
+3
-3
GPU/Texture2D.cpp
GPU/Texture2D.cpp
+22
-18
GPU/Texture2D.h
GPU/Texture2D.h
+29
-29
GPU/Texture2DArray.cpp
GPU/Texture2DArray.cpp
+9
-9
GPU/Texture3D.cpp
GPU/Texture3D.cpp
+15
-11
GPU/TextureCube.cpp
GPU/TextureCube.cpp
+29
-29
GPU/TextureCube.h
GPU/TextureCube.h
+7
-7
GPU/VBO.h
GPU/VBO.h
+16
-16
No files found.
GPU/Alignment.h
View file @
c43ad4fd
...
...
@@ -57,7 +57,7 @@ namespace GPU
inline
void
SetAlignment
(
GLenum
alignParam
,
unsigned
int
stride
)
{
static
const
int
alignment
[
8
]
=
{
8
,
1
,
2
,
1
,
4
,
1
,
2
,
1
};
g
lPixelStorei
(
alignParam
,
alignment
[
stride
&
7
]
);
g
puAssert
(
glPixelStorei
(
alignParam
,
alignment
[
stride
&
7
]
)
);
}
inline
void
SetPackAlignment
(
unsigned
int
stride
)
...
...
GPU/FrameBuffer.cpp
View file @
c43ad4fd
...
...
@@ -14,14 +14,14 @@
bool
GPU
::
RenderBuffer
::
Allocate
()
{
g
lGenRenderbuffersEXT
(
1
,
&
m_Id
);
g
puAssert
(
glGenRenderbuffersEXT
(
1
,
&
m_Id
)
);
return
m_Id
!=
0
;
}
bool
GPU
::
RenderBuffer
::
Unallocate
()
{
g
lDeleteRenderbuffersEXT
(
1
,
&
m_Id
);
g
puAssert
(
glDeleteRenderbuffersEXT
(
1
,
&
m_Id
)
);
m_Id
=
0
;
return
true
;
}
...
...
@@ -34,9 +34,9 @@ bool GPU::RenderBuffer::Create( const GLenum internalFormats[],
if
(
w
&&
h
&&
Instantiate
()
)
{
GLint
prevBuffer
;
g
lGetIntegerv
(
GL_RENDERBUFFER_BINDING
,
&
prevBuffer
);
g
puAssert
(
glGetIntegerv
(
GL_RENDERBUFFER_BINDING
,
&
prevBuffer
)
);
g
lBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
m_Id
);
g
puAssert
(
glBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
m_Id
)
);
int
currentFormatId
=
-
1
;
GLint
isSupported
;
...
...
@@ -46,26 +46,28 @@ bool GPU::RenderBuffer::Create( const GLenum internalFormats[],
{
m_Width
=
m_Height
=
0
;
std
::
cout
<<
"RenderBuffer error - specified internal format(s) not supported."
<<
std
::
endl
;
g
lBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
prevBuffer
)
);
return
false
;
}
if
(
glGetInternalformativ
)
glGetInternalformativ
(
GL_RENDERBUFFER
,
internalFormats
[
currentFormatId
],
GL_INTERNALFORMAT_SUPPORTED
,
1
,
&
isSupported
);
{
gpuAssert
(
glGetInternalformativ
(
GL_RENDERBUFFER
,
internalFormats
[
currentFormatId
],
GL_INTERNALFORMAT_SUPPORTED
,
1
,
&
isSupported
)
);
}
else
{
glGetError
();
glRenderbufferStorageEXT
(
GL_RENDERBUFFER
,
internalFormats
[
currentFormatId
],
w
,
h
);
isSupported
=
glGetError
()
==
GL_NO_ERROR
;
isSupported
=
(
glGetError
()
==
GL_NO_ERROR
)
;
}
}
while
(
!
isSupported
);
g
lRenderbufferStorageEXT
(
GL_RENDERBUFFER
,
internalFormats
[
currentFormatId
],
w
,
h
);
g
puAssert
(
glRenderbufferStorageEXT
(
GL_RENDERBUFFER
,
internalFormats
[
currentFormatId
],
w
,
h
)
);
m_Width
=
w
;
m_Height
=
h
;
g
lBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
prevBuffer
)
);
return
true
;
}
...
...
@@ -79,10 +81,10 @@ GLint GPU::RenderBuffer::InternalFormat() const
if
(
m_Id
)
{
GLint
prevBuffer
;
g
lGetIntegerv
(
GL_RENDERBUFFER_BINDING
,
&
prevBuffer
);
g
lBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
m_Id
);
g
lGetRenderbufferParameterivEXT
(
GL_RENDERBUFFER_EXT
,
GL_RENDERBUFFER_INTERNAL_FORMAT
,
&
format
);
g
lBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glGetIntegerv
(
GL_RENDERBUFFER_BINDING
,
&
prevBuffer
)
);
g
puAssert
(
glBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
m_Id
)
);
g
puAssert
(
glGetRenderbufferParameterivEXT
(
GL_RENDERBUFFER_EXT
,
GL_RENDERBUFFER_INTERNAL_FORMAT
,
&
format
)
);
g
puAssert
(
glBindRenderbufferEXT
(
GL_RENDERBUFFER_EXT
,
prevBuffer
)
);
}
return
format
;
}
...
...
@@ -99,12 +101,12 @@ bool GPU::FrameBuffer::Create( const unsigned int w,
m_Height
=
h
;
GLint
prevBuffer
;
g
lGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
);
g
puAssert
(
glGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
)
);
g
lGenFramebuffersEXT
(
1
,
&
m_Id
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
);
g
puAssert
(
glGenFramebuffersEXT
(
1
,
&
m_Id
)
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
)
);
return
true
;
}
...
...
@@ -120,7 +122,7 @@ void GPU::FrameBuffer::Release()
m_Buffers
.
clear
();
m_EnabledBuffers
.
clear
();
g
lDeleteFramebuffersEXT
(
1
,
&
m_Id
);
g
puAssert
(
glDeleteFramebuffersEXT
(
1
,
&
m_Id
)
);
m_Id
=
0
;
}
}
...
...
@@ -153,15 +155,15 @@ bool GPU::FrameBuffer::Attach( const GLuint attachment,
Detach
(
attachment
);
GLint
prevBuffer
;
g
lGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
);
g
puAssert
(
glGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
);
g
lFramebufferRenderbufferEXT
(
GL_FRAMEBUFFER_EXT
,
attachment
,
GL_RENDERBUFFER
,
buff
.
Id
(
)
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
)
);
g
puAssert
(
glFramebufferRenderbufferEXT
(
GL_FRAMEBUFFER_EXT
,
attachment
,
GL_RENDERBUFFER
,
buff
.
Id
()
)
);
m_Buffers
[
attachment
]
=
new
RenderBuffer
(
buff
);
Enable
(
attachment
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
)
);
return
true
;
}
...
...
@@ -180,15 +182,15 @@ bool GPU::FrameBuffer::Attach( const GLuint attachment,
Detach
(
attachment
);
GLint
prevBuffer
;
g
lGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
);
g
puAssert
(
glGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
);
g
lFramebufferTexture2DEXT
(
GL_FRAMEBUFFER_EXT
,
attachment
,
GL_TEXTURE_2D
,
tex
.
Id
(),
0
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
)
);
g
puAssert
(
glFramebufferTexture2DEXT
(
GL_FRAMEBUFFER_EXT
,
attachment
,
GL_TEXTURE_2D
,
tex
.
Id
(),
0
)
);
m_Buffers
[
attachment
]
=
new
Texture2D
(
tex
);
Enable
(
attachment
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
)
);
return
true
;
}
...
...
@@ -208,15 +210,15 @@ bool GPU::FrameBuffer::Attach( const GLuint attachment,
Detach
(
attachment
);
GLint
prevBuffer
;
g
lGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
);
g
puAssert
(
glGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
);
g
lFramebufferTexture2DEXT
(
GL_FRAMEBUFFER_EXT
,
attachment
,
targetCubeFace
,
tex
.
Id
(),
0
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
)
);
g
puAssert
(
glFramebufferTexture2DEXT
(
GL_FRAMEBUFFER_EXT
,
attachment
,
targetCubeFace
,
tex
.
Id
(),
0
)
);
m_Buffers
[
attachment
]
=
new
TextureCube
(
tex
);
Enable
(
attachment
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
)
);
return
true
;
}
...
...
@@ -266,24 +268,28 @@ void GPU::FrameBuffer::Disable( const GLuint attachment )
void
GPU
::
FrameBuffer
::
Bind
()
const
{
g
lGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
m_PrevBuffer
);
g
lGetIntegerv
(
GL_VIEWPORT
,
m_PrevViewport
);
g
puAssert
(
glGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
m_PrevBuffer
)
);
g
puAssert
(
glGetIntegerv
(
GL_VIEWPORT
,
m_PrevViewport
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
)
);
if
(
!
m_EnabledBuffers
.
empty
()
)
glDrawBuffersARB
(
(
GLsizei
)
m_EnabledBuffers
.
size
(),
&
m_EnabledBuffers
.
front
()
);
{
gpuAssert
(
glDrawBuffersARB
(
(
GLsizei
)
m_EnabledBuffers
.
size
(),
&
m_EnabledBuffers
.
front
()
)
);
}
else
glDrawBuffersARB
(
0
,
NULL
);
{
gpuAssert
(
glDrawBuffersARB
(
0
,
NULL
)
);
}
g
lViewport
(
0
,
0
,
m_Width
,
m_Height
);
g
puAssert
(
glViewport
(
0
,
0
,
m_Width
,
m_Height
)
);
}
void
GPU
::
FrameBuffer
::
Unbind
()
const
{
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_PrevBuffer
);
g
lViewport
(
m_PrevViewport
[
0
],
m_PrevViewport
[
1
],
m_PrevViewport
[
2
],
m_PrevViewport
[
3
]
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_PrevBuffer
)
);
g
puAssert
(
glViewport
(
m_PrevViewport
[
0
],
m_PrevViewport
[
1
],
m_PrevViewport
[
2
],
m_PrevViewport
[
3
]
)
);
}
...
...
@@ -299,18 +305,18 @@ bool GPU::FrameBuffer::DumpTo( const GLuint attachment,
{
// Read data from the buffer into which the mask has been painted.
GLint
prevBuffer
,
prevAlignment
;
g
lGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
);
g
lGetIntegerv
(
GL_PACK_ALIGNMENT
,
&
prevAlignment
);
g
puAssert
(
glGetIntegerv
(
GL_FRAMEBUFFER_BINDING
,
&
prevBuffer
)
);
g
puAssert
(
glGetIntegerv
(
GL_PACK_ALIGNMENT
,
&
prevAlignment
)
);
const
int
alignment
[
8
]
=
{
8
,
1
,
2
,
1
,
4
,
1
,
2
,
1
};
g
lPixelStorei
(
GL_PACK_ALIGNMENT
,
alignment
[
stride
&
7
]
);
g
puAssert
(
glPixelStorei
(
GL_PACK_ALIGNMENT
,
alignment
[
stride
&
7
]
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
);
g
lReadBuffer
(
attachment
);
g
lReadPixels
(
x
,
y
,
w
,
h
,
format
,
type
,
buffer
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
m_Id
)
);
g
puAssert
(
glReadBuffer
(
attachment
)
);
g
puAssert
(
glReadPixels
(
x
,
y
,
w
,
h
,
format
,
type
,
buffer
)
);
g
lBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
);
g
lPixelStorei
(
GL_PACK_ALIGNMENT
,
prevAlignment
);
g
puAssert
(
glBindFramebufferEXT
(
GL_FRAMEBUFFER_EXT
,
prevBuffer
)
);
g
puAssert
(
glPixelStorei
(
GL_PACK_ALIGNMENT
,
prevAlignment
)
);
return
true
;
}
...
...
GPU/GPUdefs.h
View file @
c43ad4fd
...
...
@@ -11,3 +11,27 @@
#include <windows.h>
#endif
#include <GL/gl.h>
#ifdef NDEBUG
#define gpuAssert( expression ) expression
#else
#include <assert.h>
#include <stdio.h>
#define gpuAssert( expression ) \
{ \
expression; \
GLenum err = glGetError(); \
if( err != GL_NO_ERROR ) \
{ \
const GLubyte* errStr = glewGetErrorString( err ); \
printf( "gpuAssert( %s ): %s\n", #expression, errStr ); \
assert( err == GL_NO_ERROR ); \
} \
}
#endif
\ No newline at end of file
GPU/Shader.cpp
View file @
c43ad4fd
...
...
@@ -18,14 +18,14 @@
bool
GPU
::
Shader
::
PgObject
::
Allocate
()
{
m_Id
=
glCreateShaderObjectARB
(
m_PgType
);
gpuAssert
(
m_Id
=
glCreateShaderObjectARB
(
m_PgType
)
);
return
m_Id
!=
0
;
}
bool
GPU
::
Shader
::
PgObject
::
Unallocate
()
{
g
lDeleteObjectARB
(
m_Id
);
g
puAssert
(
glDeleteObjectARB
(
m_Id
)
);
m_Id
=
0
;
return
true
;
}
...
...
@@ -69,12 +69,12 @@ bool GPU::Shader::PgObject::CompileSrcString( const char *sourceString,
if
(
Instantiate
()
)
{
// Create the shader object.
g
lShaderSourceARB
(
m_Id
,
1
,
(
const
GLcharARB
**
)
&
sourceString
,
NULL
);
g
lCompileShaderARB
(
m_Id
);
g
puAssert
(
glShaderSourceARB
(
m_Id
,
1
,
(
const
GLcharARB
**
)
&
sourceString
,
NULL
)
);
g
puAssert
(
glCompileShaderARB
(
m_Id
)
);
// Check the compilation status.
GLint
status
;
g
lGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_COMPILE_STATUS_ARB
,
&
status
);
g
puAssert
(
glGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_COMPILE_STATUS_ARB
,
&
status
)
);
if
(
status
)
return
true
;
...
...
@@ -93,11 +93,11 @@ bool GPU::Shader::PgObject::CompileSrcString( const char *sourceString,
std
::
string
GPU
::
Shader
::
GetLogs
(
GLuint
pgId
)
{
GLint
logLength
;
g
lGetObjectParameterivARB
(
pgId
,
GL_OBJECT_INFO_LOG_LENGTH_ARB
,
&
logLength
);
g
puAssert
(
glGetObjectParameterivARB
(
pgId
,
GL_OBJECT_INFO_LOG_LENGTH_ARB
,
&
logLength
)
);
std
::
string
infoLog
;
infoLog
.
resize
(
logLength
);
g
lGetInfoLogARB
(
pgId
,
logLength
,
&
logLength
,
&
infoLog
[
0
]
);
g
puAssert
(
glGetInfoLogARB
(
pgId
,
logLength
,
&
logLength
,
&
infoLog
[
0
]
)
);
return
infoLog
;
}
...
...
@@ -112,7 +112,7 @@ void GPU::Shader::RecoverActiveUniforms()
GLint
count
;
GLcharARB
nameBuffer
[
512
];
g
lGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_ACTIVE_UNIFORMS_ARB
,
&
count
);
g
puAssert
(
glGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_ACTIVE_UNIFORMS_ARB
,
&
count
)
);
for
(
GLint
i
=
0
;
i
<
count
;
++
i
)
{
...
...
@@ -120,7 +120,7 @@ void GPU::Shader::RecoverActiveUniforms()
GLint
size
;
GLenum
type
;
glGetActiveUniformARB
(
g
puAssert
(
g
lGetActiveUniformARB
(
m_Id
,
i
,
sizeof
(
nameBuffer
),
...
...
@@ -128,7 +128,7 @@ void GPU::Shader::RecoverActiveUniforms()
&
size
,
&
type
,
nameBuffer
);
)
)
;
std
::
string
name
(
nameBuffer
);
...
...
@@ -172,7 +172,7 @@ void GPU::Shader::RecoverActiveUniforms()
case
GL_UNSIGNED_INT_SAMPLER_2D_RECT
:
{
Uniform
&
smpl
=
m_Samplers
[
name
];
smpl
.
location
=
glGetUniformLocationARB
(
m_Id
,
nameBuffer
);
gpuAssert
(
smpl
.
location
=
glGetUniformLocationARB
(
m_Id
,
nameBuffer
)
);
smpl
.
size
=
size
;
smpl
.
type
=
type
;
break
;
...
...
@@ -180,7 +180,7 @@ void GPU::Shader::RecoverActiveUniforms()
default:
{
Uniform
&
unif
=
m_Uniforms
[
name
];
unif
.
location
=
glGetUniformLocationARB
(
m_Id
,
nameBuffer
);
gpuAssert
(
unif
.
location
=
glGetUniformLocationARB
(
m_Id
,
nameBuffer
)
);
unif
.
size
=
size
;
unif
.
type
=
type
;
break
;
...
...
@@ -197,7 +197,7 @@ void GPU::Shader::RecoverActiveAttributes()
GLint
count
;
GLcharARB
nameBuffer
[
512
];
g
lGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_ACTIVE_ATTRIBUTES_ARB
,
&
count
);
g
puAssert
(
glGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_ACTIVE_ATTRIBUTES_ARB
,
&
count
)
);
for
(
GLint
i
=
0
;
i
<
count
;
++
i
)
{
...
...
@@ -205,7 +205,7 @@ void GPU::Shader::RecoverActiveAttributes()
GLint
size
;
GLenum
type
;
glGetActiveAttribARB
(
g
puAssert
(
g
lGetActiveAttribARB
(
m_Id
,
i
,
sizeof
(
nameBuffer
),
...
...
@@ -213,9 +213,10 @@ void GPU::Shader::RecoverActiveAttributes()
&
size
,
&
type
,
nameBuffer
);
)
)
;
GLint
attribId
=
glGetAttribLocationARB
(
m_Id
,
nameBuffer
);
GLint
attribId
;
gpuAssert
(
attribId
=
glGetAttribLocationARB
(
m_Id
,
nameBuffer
)
);
if
(
attribId
!=
-
1
)
m_Attributes
[
std
::
string
(
nameBuffer
)
]
=
attribId
;
}
...
...
@@ -224,29 +225,33 @@ void GPU::Shader::RecoverActiveAttributes()
bool
GPU
::
Shader
::
Link
(
std
::
string
*
logs
)
{
if
(
!
m_Id
&&
!
(
m_Id
=
glCreateProgramObjectARB
())
)
return
false
;
if
(
!
m_Id
)
{
gpuAssert
(
m_Id
=
glCreateProgramObjectARB
()
);
if
(
!
m_Id
)
return
false
;
}
if
(
m_VertPg
.
IsInstantiated
()
)
g
lAttachObjectARB
(
m_Id
,
m_VertPg
.
Id
(
)
);
g
puAssert
(
glAttachObjectARB
(
m_Id
,
m_VertPg
.
Id
()
)
);
if
(
m_FragPg
.
IsInstantiated
()
)
g
lAttachObjectARB
(
m_Id
,
m_FragPg
.
Id
(
)
);
g
puAssert
(
glAttachObjectARB
(
m_Id
,
m_FragPg
.
Id
()
)
);
if
(
m_GeomPg
.
IsInstantiated
()
)
g
lAttachObjectARB
(
m_Id
,
m_GeomPg
.
Id
(
)
);
g
puAssert
(
glAttachObjectARB
(
m_Id
,
m_GeomPg
.
Id
()
)
);
g
lLinkProgramARB
(
m_Id
);
g
puAssert
(
glLinkProgramARB
(
m_Id
)
);
GLint
status
;
g
lGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_LINK_STATUS_ARB
,
&
status
);
g
puAssert
(
glGetObjectParameterivARB
(
m_Id
,
GL_OBJECT_LINK_STATUS_ARB
,
&
status
)
);
if
(
!
status
)
{
if
(
logs
)
*
logs
=
GetLogs
(
m_Id
);
g
lDeleteObjectARB
(
m_Id
);
g
puAssert
(
glDeleteObjectARB
(
m_Id
)
);
m_Id
=
0
;
return
false
;
...
...
@@ -268,21 +273,21 @@ GPU::Shader& GPU::Shader::Attach( const PgObject &pg )
case
GL_VERTEX_SHADER_ARB
:
{
if
(
m_Id
&&
m_VertPg
.
IsInstantiated
()
)
g
lDetachObjectARB
(
m_Id
,
m_VertPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_VertPg
.
Id
()
)
);
m_VertPg
=
*
(
VertPg
*
)
&
pg
;
break
;
}
case
GL_FRAGMENT_SHADER_ARB
:
{
if
(
m_Id
&&
m_FragPg
.
IsInstantiated
()
)
g
lDetachObjectARB
(
m_Id
,
m_FragPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_FragPg
.
Id
()
)
);
m_FragPg
=
*
(
FragPg
*
)
&
pg
;
break
;
}
case
GL_GEOMETRY_SHADER_EXT
:
{
if
(
m_Id
&&
m_GeomPg
.
IsInstantiated
()
)
g
lDetachObjectARB
(
m_Id
,
m_GeomPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_GeomPg
.
Id
()
)
);
m_GeomPg
=
*
(
GeomPg
*
)
&
pg
;
break
;
}
...
...
@@ -295,7 +300,7 @@ GPU::Shader& GPU::Shader::Attach( const PgObject &pg )
GPU
::
Shader
&
GPU
::
Shader
::
DetachVertPg
()
{
if
(
m_Id
&&
m_VertPg
.
IsInstantiated
()
)
g
lDetachObjectARB
(
m_Id
,
m_VertPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_VertPg
.
Id
()
)
);
m_VertPg
.
Release
();
return
*
this
;
}
...
...
@@ -304,7 +309,7 @@ GPU::Shader& GPU::Shader::DetachVertPg()
GPU
::
Shader
&
GPU
::
Shader
::
DetachFragPg
()
{
if
(
m_Id
&&
m_FragPg
.
IsInstantiated
()
)
g
lDetachObjectARB
(
m_Id
,
m_FragPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_FragPg
.
Id
()
)
);
m_FragPg
.
Release
();
return
*
this
;
}
...
...
@@ -313,7 +318,7 @@ GPU::Shader& GPU::Shader::DetachFragPg()
GPU
::
Shader
&
GPU
::
Shader
::
DetachGeomPg
()
{
if
(
m_Id
&&
m_GeomPg
.
IsInstantiated
()
)
g
lDetachObjectARB
(
m_Id
,
m_GeomPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_GeomPg
.
Id
()
)
);
m_GeomPg
.
Release
();
return
*
this
;
}
...
...
@@ -351,21 +356,21 @@ void GPU::Shader::Release()
{
if
(
m_VertPg
.
Id
()
)
{
g
lDetachObjectARB
(
m_Id
,
m_VertPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_VertPg
.
Id
()
)
);
m_VertPg
.
Release
();
}
if
(
m_FragPg
.
Id
()
)
{
g
lDetachObjectARB
(
m_Id
,
m_FragPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_FragPg
.
Id
()
)
);
m_FragPg
.
Release
();
}
if
(
m_GeomPg
.
Id
()
)
{
g
lDetachObjectARB
(
m_Id
,
m_GeomPg
.
Id
(
)
);
g
puAssert
(
glDetachObjectARB
(
m_Id
,
m_GeomPg
.
Id
()
)
);
m_GeomPg
.
Release
();
}
g
lDeleteObjectARB
(
m_Id
);
g
puAssert
(
glDeleteObjectARB
(
m_Id
)
);
m_Id
=
0
;
m_Uniforms
.
clear
();
...
...
@@ -382,30 +387,31 @@ void GPU::Shader::SetUniform( const std::string& name,
UniformMap
::
iterator
uu
=
m_Uniforms
.
find
(
name
);
if
(
uu
!=
m_Uniforms
.
end
()
)
{
GLuint
activeProgBackup
=
glGetHandleARB
(
GL_PROGRAM_OBJECT_ARB
);
glUseProgramObjectARB
(
m_Id
);
GLuint
activeProgBackup
;
gpuAssert
(
activeProgBackup
=
glGetHandleARB
(
GL_PROGRAM_OBJECT_ARB
)
);
gpuAssert
(
glUseProgramObjectARB
(
m_Id
)
);
Uniform
&
u
=
uu
->
second
;
switch
(
u
.
type
)
{
case
GL_FLOAT
:
g
lUniform1fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
);
break
;
case
GL_FLOAT_VEC2_ARB
:
g
lUniform2fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
);
break
;
case
GL_FLOAT_VEC3_ARB
:
g
lUniform3fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
);
break
;
case
GL_FLOAT_VEC4_ARB
:
g
lUniform4fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
);
break
;
case
GL_INT
:
g
lUniform1ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_INT_VEC2_ARB
:
g
lUniform2ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_INT_VEC3_ARB
:
g
lUniform3ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_INT_VEC4_ARB
:
g
lUniform4ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_BOOL_ARB
:
g
lUniform1ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_BOOL_VEC2_ARB
:
g
lUniform2ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_BOOL_VEC3_ARB
:
g
lUniform3ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_BOOL_VEC4_ARB
:
g
lUniform4ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
);
break
;
case
GL_FLOAT_MAT2_ARB
:
g
lUniformMatrix2fvARB
(
u
.
location
,
u
.
size
,
GL_FALSE
,
(
GLfloat
*
)
value
);
break
;
case
GL_FLOAT_MAT3_ARB
:
g
lUniformMatrix3fvARB
(
u
.
location
,
u
.
size
,
GL_FALSE
,
(
GLfloat
*
)
value
);
break
;
case
GL_FLOAT_MAT4_ARB
:
g
lUniformMatrix4fvARB
(
u
.
location
,
u
.
size
,
GL_FALSE
,
(
GLfloat
*
)
value
);
break
;
case
GL_FLOAT
:
g
puAssert
(
glUniform1fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
)
);
break
;
case
GL_FLOAT_VEC2_ARB
:
g
puAssert
(
glUniform2fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
)
);
break
;
case
GL_FLOAT_VEC3_ARB
:
g
puAssert
(
glUniform3fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
)
);
break
;
case
GL_FLOAT_VEC4_ARB
:
g
puAssert
(
glUniform4fvARB
(
u
.
location
,
u
.
size
,
(
GLfloat
*
)
value
)
);
break
;
case
GL_INT
:
g
puAssert
(
glUniform1ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_INT_VEC2_ARB
:
g
puAssert
(
glUniform2ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_INT_VEC3_ARB
:
g
puAssert
(
glUniform3ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_INT_VEC4_ARB
:
g
puAssert
(
glUniform4ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_BOOL_ARB
:
g
puAssert
(
glUniform1ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_BOOL_VEC2_ARB
:
g
puAssert
(
glUniform2ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_BOOL_VEC3_ARB
:
g
puAssert
(
glUniform3ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_BOOL_VEC4_ARB
:
g
puAssert
(
glUniform4ivARB
(
u
.
location
,
u
.
size
,
(
GLint
*
)
value
)
);
break
;
case
GL_FLOAT_MAT2_ARB
:
g
puAssert
(
glUniformMatrix2fvARB
(
u
.
location
,
u
.
size
,
GL_FALSE
,
(
GLfloat
*
)
value
)
);
break
;
case
GL_FLOAT_MAT3_ARB
:
g
puAssert
(
glUniformMatrix3fvARB
(
u
.
location
,
u
.
size
,
GL_FALSE
,
(
GLfloat
*
)
value
)
);
break
;
case
GL_FLOAT_MAT4_ARB
:
g
puAssert
(
glUniformMatrix4fvARB
(
u
.
location
,
u
.
size
,
GL_FALSE
,
(
GLfloat
*
)
value
)
);
break
;
}
g
lUseProgramObjectARB
(
activeProgBackup
);
g
puAssert
(
glUseProgramObjectARB
(
activeProgBackup
)
);
}
}
...
...
@@ -416,12 +422,13 @@ void GPU::Shader::SetSamplers( const std::string& name,
UniformMap
::
iterator
s
=
m_Samplers
.
find
(
name
);
if
(
s
!=
m_Samplers
.
end
()
)
{
GLuint
activeProgBackup
=
glGetHandleARB
(
GL_PROGRAM_OBJECT_ARB
);
glUseProgramObjectARB
(
m_Id
);
GLuint
activeProgBackup
;
gpuAssert
(
activeProgBackup
=
glGetHandleARB
(
GL_PROGRAM_OBJECT_ARB
)
);
gpuAssert
(
glUseProgramObjectARB
(
m_Id
)
);
g
lUniform1ivARB
(
s
->
second
.
location
,
s
->
second
.
size
,
(
GLint
*
)
texUnit
);
g
puAssert
(
glUniform1ivARB
(
s
->
second
.
location
,
s
->
second
.
size
,
(
GLint
*
)
texUnit
)
);
g
lUseProgramObjectARB
(
activeProgBackup
);
g
puAssert
(
glUseProgramObjectARB
(
activeProgBackup
)
);
}
}
...
...
@@ -436,12 +443,13 @@ void GPU::Shader::SetSamplers( const std::string& name,
for
(
GLint
i
=
0
;
i
<
s
->
second
.
size
;
++
i
)
texUnits
[
i
]
=
firstTexUnit
+
i
;
GLuint
activeProgBackup
=
glGetHandleARB
(
GL_PROGRAM_OBJECT_ARB
);
glUseProgramObjectARB
(
m_Id
);
GLuint
activeProgBackup
;
gpuAssert
(
activeProgBackup
=
glGetHandleARB
(
GL_PROGRAM_OBJECT_ARB
)
);
gpuAssert
(
glUseProgramObjectARB
(
m_Id
)
);
g
lUniform1ivARB
(
s
->
second
.
location
,
s
->
second
.
size
,
texUnits
);
g
puAssert
(
glUniform1ivARB
(
s
->
second
.
location
,
s
->
second
.
size
,
texUnits
)
);
g
lUseProgramObjectARB
(
activeProgBackup
);
g
puAssert
(
glUseProgramObjectARB
(
activeProgBackup
)
);
delete
[]
texUnits
;
}
...
...
GPU/Shader.h
View file @
c43ad4fd
...
...
@@ -180,8 +180,8 @@ namespace GPU
inline
const
GeomPg
&
GeomProgram
()
const
{
return
m_GeomPg
;
}
inline
GeomPg
&
GeomProgram
()
{
return
m_GeomPg
;
}
inline
void
Bind
()
{
g
lUseProgramObjectARB
(
m_Id
);
BindSamplers
();
}
inline
void
Unbind
()
{
UnbindSamplers
();
g
lUseProgramObjectARB
(
0
);
}
inline
void
Bind
()
{
g
puAssert
(
glUseProgramObjectARB
(
m_Id
)
);
BindSamplers
();
}
inline
void
Unbind
()
{
UnbindSamplers
();
g
puAssert
(
glUseProgramObjectARB
(
0
)
);
}
void
SetUniform
(
const
std
::
string
&
name
,
const
void
*
value
);
...
...
@@ -242,7 +242,7 @@ namespace GPU