GL cache fix
This commit is contained in:
parent
de046c4620
commit
d8165376be
|
@ -7,20 +7,6 @@ class GLCache {
|
|||
public:
|
||||
GLCache() { Reset(); }
|
||||
|
||||
void BindBuffer(GLenum target, GLuint buffer) {
|
||||
switch (target) {
|
||||
case GL_ARRAY_BUFFER:
|
||||
if (_array_buffer != buffer) {
|
||||
glBindBuffer(target, buffer);
|
||||
_array_buffer = buffer;
|
||||
}
|
||||
case GL_ELEMENT_ARRAY_BUFFER:
|
||||
if (_element_array_buffer != buffer) {
|
||||
glBindBuffer(target, buffer);
|
||||
_element_array_buffer = buffer;
|
||||
}
|
||||
}
|
||||
}
|
||||
void BindTexture(GLenum target, GLuint texture) {
|
||||
if (target == GL_TEXTURE_2D && texture != _texture) {
|
||||
glBindTexture(target, texture);
|
||||
|
@ -40,11 +26,11 @@ public:
|
|||
|
||||
void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
|
||||
if (red != _clear_r || green != _clear_g || blue != _clear_b || alpha != _clear_a) {
|
||||
glClearColor(red, green, blue, alpha);
|
||||
_clear_r = red;
|
||||
_clear_g = green;
|
||||
_clear_b = blue;
|
||||
_clear_a = alpha;
|
||||
glClearColor(red, green, blue, alpha);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,16 +41,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void DeleteBuffers(GLsizei n, const GLuint *buffers) {
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (buffers[i] == _array_buffer)
|
||||
_array_buffer = 0;
|
||||
if (buffers[i] == _element_array_buffer)
|
||||
_element_array_buffer = 0;
|
||||
}
|
||||
glDeleteBuffers(n, buffers);
|
||||
}
|
||||
|
||||
void DeleteTextures(GLsizei n, const GLuint *textures) {
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (textures[i] == _texture) {
|
||||
|
@ -90,65 +66,11 @@ public:
|
|||
}
|
||||
|
||||
void Enable(GLenum cap) {
|
||||
switch (cap) {
|
||||
case GL_BLEND:
|
||||
if (_en_blend)
|
||||
return;
|
||||
_en_blend = true;
|
||||
break;
|
||||
case GL_CULL_FACE:
|
||||
if (_en_cull_face)
|
||||
return;
|
||||
_en_cull_face = true;
|
||||
break;
|
||||
case GL_DEPTH_TEST:
|
||||
if (_en_depth_test)
|
||||
return;
|
||||
_en_depth_test = true;
|
||||
break;
|
||||
case GL_SCISSOR_TEST:
|
||||
if (_en_scissor_test)
|
||||
return;
|
||||
_en_scissor_test = true;
|
||||
break;
|
||||
case GL_STENCIL_TEST:
|
||||
if (_en_stencil_test)
|
||||
return;
|
||||
_en_stencil_test = true;
|
||||
break;
|
||||
}
|
||||
glEnable(cap);
|
||||
setCapability(cap, true);
|
||||
}
|
||||
|
||||
void Disable(GLenum cap) {
|
||||
switch (cap) {
|
||||
case GL_BLEND:
|
||||
if (!_en_blend)
|
||||
return;
|
||||
_en_blend = false;
|
||||
break;
|
||||
case GL_CULL_FACE:
|
||||
if (!_en_cull_face)
|
||||
return;
|
||||
_en_cull_face = false;
|
||||
break;
|
||||
case GL_DEPTH_TEST:
|
||||
if (!_en_depth_test)
|
||||
return;
|
||||
_en_depth_test = false;
|
||||
break;
|
||||
case GL_SCISSOR_TEST:
|
||||
if (!_en_scissor_test)
|
||||
return;
|
||||
_en_scissor_test = false;
|
||||
break;
|
||||
case GL_STENCIL_TEST:
|
||||
if (!_en_stencil_test)
|
||||
return;
|
||||
_en_stencil_test = false;
|
||||
break;
|
||||
}
|
||||
glDisable(cap);
|
||||
setCapability(cap, false);
|
||||
}
|
||||
|
||||
void UseProgram(GLuint program) {
|
||||
|
@ -163,7 +85,6 @@ public:
|
|||
_stencil_func = func;
|
||||
_stencil_ref = ref;
|
||||
_stencil_fmask = mask;
|
||||
|
||||
glStencilFunc(func, ref, mask);
|
||||
}
|
||||
}
|
||||
|
@ -173,7 +94,6 @@ public:
|
|||
_stencil_sfail = sfail;
|
||||
_stencil_dpfail = dpfail;
|
||||
_stencil_dppass = dppass;
|
||||
|
||||
glStencilOp(sfail, dpfail, dppass);
|
||||
}
|
||||
}
|
||||
|
@ -194,8 +114,6 @@ public:
|
|||
}
|
||||
|
||||
void Reset() {
|
||||
_array_buffer = 0;
|
||||
_element_array_buffer = 0;
|
||||
_texture = 0;
|
||||
_src_blend_factor = GL_ONE;
|
||||
_dst_blend_factor = GL_ZERO;
|
||||
|
@ -223,8 +141,36 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
GLuint _array_buffer;
|
||||
GLuint _element_array_buffer;
|
||||
void setCapability(GLenum cap, bool value) {
|
||||
bool *pCap = NULL;
|
||||
switch (cap) {
|
||||
case GL_BLEND:
|
||||
pCap = &_en_blend;
|
||||
break;
|
||||
case GL_CULL_FACE:
|
||||
pCap = &_en_cull_face;
|
||||
break;
|
||||
case GL_DEPTH_TEST:
|
||||
pCap = &_en_depth_test;
|
||||
break;
|
||||
case GL_SCISSOR_TEST:
|
||||
pCap = &_en_scissor_test;
|
||||
break;
|
||||
case GL_STENCIL_TEST:
|
||||
pCap = &_en_stencil_test;
|
||||
break;
|
||||
}
|
||||
if (pCap != NULL) {
|
||||
if (*pCap == value)
|
||||
return;
|
||||
*pCap = value;
|
||||
}
|
||||
if (value)
|
||||
glEnable(cap);
|
||||
else
|
||||
glDisable(cap);
|
||||
}
|
||||
|
||||
GLuint _texture;
|
||||
GLenum _src_blend_factor;
|
||||
GLenum _dst_blend_factor;
|
||||
|
|
|
@ -719,7 +719,7 @@ void GenSorted(int first, int count)
|
|||
if (pidx_sort.size())
|
||||
{
|
||||
//Bind and upload sorted index buffer
|
||||
glcache.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs2); glCheck();
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs2); glCheck();
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER,vidx_sort.size()*2,&vidx_sort[0],GL_STREAM_DRAW);
|
||||
|
||||
if (tess_gen) printf("Generated %.2fK Triangles !\n",tess_gen/1000.0);
|
||||
|
@ -731,7 +731,7 @@ void DrawSorted()
|
|||
//if any drawing commands, draw them
|
||||
if (pidx_sort.size())
|
||||
{
|
||||
glcache.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs2); glCheck();
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs2); glCheck();
|
||||
|
||||
u32 count=pidx_sort.size();
|
||||
|
||||
|
@ -872,8 +872,8 @@ void SetupMainVBO()
|
|||
glBindVertexArray(gl.vbo.vao);
|
||||
#endif
|
||||
|
||||
glcache.BindBuffer(GL_ARRAY_BUFFER, gl.vbo.geometry); glCheck();
|
||||
glcache.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs); glCheck();
|
||||
glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.geometry); glCheck();
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs); glCheck();
|
||||
|
||||
//setup vertex buffers attrib pointers
|
||||
glEnableVertexAttribArray(VERTEX_POS_ARRAY); glCheck();
|
||||
|
@ -895,7 +895,7 @@ void SetupModvolVBO()
|
|||
glBindVertexArray(gl.vbo.vao);
|
||||
#endif
|
||||
|
||||
glcache.BindBuffer(GL_ARRAY_BUFFER, gl.vbo.modvols); glCheck();
|
||||
glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.modvols); glCheck();
|
||||
|
||||
//setup vertex buffers attrib pointers
|
||||
glEnableVertexAttribArray(VERTEX_POS_ARRAY); glCheck();
|
||||
|
|
|
@ -1780,8 +1780,8 @@ bool RenderFrame()
|
|||
//move vertex to gpu
|
||||
|
||||
//Main VBO
|
||||
glcache.BindBuffer(GL_ARRAY_BUFFER, gl.vbo.geometry); glCheck();
|
||||
glcache.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs); glCheck();
|
||||
glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.geometry); glCheck();
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl.vbo.idxs); glCheck();
|
||||
|
||||
glBufferData(GL_ARRAY_BUFFER,pvrrc.verts.bytes(),pvrrc.verts.head(),GL_STREAM_DRAW); glCheck();
|
||||
|
||||
|
@ -1790,7 +1790,7 @@ bool RenderFrame()
|
|||
//Modvol VBO
|
||||
if (pvrrc.modtrig.used())
|
||||
{
|
||||
glcache.BindBuffer(GL_ARRAY_BUFFER, gl.vbo.modvols); glCheck();
|
||||
glBindBuffer(GL_ARRAY_BUFFER, gl.vbo.modvols); glCheck();
|
||||
glBufferData(GL_ARRAY_BUFFER,pvrrc.modtrig.bytes(),pvrrc.modtrig.head(),GL_STREAM_DRAW); glCheck();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue