reset glEnableClientState befor every draw

should be done with VAO, but atm, this is not possible :-(
this also partial revert the fix in fb92c338af (activating texture0 globally).

Signed-off-by: Ryan Houdek <Sonicadvance1@gmail.com>
This commit is contained in:
degasus 2012-12-07 21:09:48 +01:00 committed by Ryan Houdek
parent 888b5fb061
commit 6864b40e26
6 changed files with 97 additions and 24 deletions

View File

@ -17,6 +17,7 @@
#include "Globals.h" #include "Globals.h"
#include "FramebufferManager.h" #include "FramebufferManager.h"
#include "VertexShaderGen.h"
#include "TextureConverter.h" #include "TextureConverter.h"
#include "Render.h" #include "Render.h"
@ -324,6 +325,22 @@ void XFBSource::Draw(const MathUtil::Rectangle<float> &sourcerc,
1.0f, 0.0f 1.0f, 0.0f
}; };
// disable all pointer, TODO: use VAO
glEnableClientState(GL_VERTEX_ARRAY);
glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableVertexAttribArray(SHADER_NORM1_ATTRIB);
glDisableVertexAttribArray(SHADER_NORM2_ATTRIB);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_SECONDARY_COLOR_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for(int i=2; i<8; i++) {
glClientActiveTexture(GL_TEXTURE0 + i);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glVertexPointer(2, GL_FLOAT, 0, vtx1); glVertexPointer(2, GL_FLOAT, 0, vtx1);
glClientActiveTexture(GL_TEXTURE0); glClientActiveTexture(GL_TEXTURE0);

View File

@ -27,8 +27,9 @@
#define COMPILED_CODE_SIZE 4096 #define COMPILED_CODE_SIZE 4096
// TODO: this guy is never initialized // TODO: Use this again for performance, but without VAO we never know exactly the last configuration
u32 s_prevcomponents; // previous state set static u32 s_prevcomponents; // previous state set
/* /*
#ifdef _WIN32 #ifdef _WIN32
#ifdef _M_IX86 #ifdef _M_IX86
@ -64,7 +65,6 @@ public:
virtual void Initialize(const PortableVertexDeclaration &_vtx_decl); virtual void Initialize(const PortableVertexDeclaration &_vtx_decl);
virtual void SetupVertexPointers(); virtual void SetupVertexPointers();
virtual void EnableComponents(u32 components);
}; };
namespace OGL namespace OGL
@ -219,34 +219,32 @@ void GLVertexFormat::SetupVertexPointers() {
glVertexAttribPointer(SHADER_POSMTX_ATTRIB, 4, GL_UNSIGNED_BYTE, GL_FALSE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.posmtx_offset)); glVertexAttribPointer(SHADER_POSMTX_ATTRIB, 4, GL_UNSIGNED_BYTE, GL_FALSE, vtx_decl.stride, (void *)(VertexManager::s_pBaseBufferPointer + vtx_decl.posmtx_offset));
} }
#endif #endif
}
void GLVertexFormat::EnableComponents(u32 components) // if (s_prevcomponents != m_components)
{
if (s_prevcomponents != components)
{ {
VertexManager::Flush(); // vertices
glEnableClientState(GL_VERTEX_ARRAY);
// matrices // matrices
if ((components & VB_HAS_POSMTXIDX) != (s_prevcomponents & VB_HAS_POSMTXIDX)) // if ((m_components & VB_HAS_POSMTXIDX) != (s_prevcomponents & VB_HAS_POSMTXIDX))
{ {
if (components & VB_HAS_POSMTXIDX) if (m_components & VB_HAS_POSMTXIDX)
glEnableVertexAttribArray(SHADER_POSMTX_ATTRIB); glEnableVertexAttribArray(SHADER_POSMTX_ATTRIB);
else else
glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB); glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB);
} }
// normals // normals
if ((components & VB_HAS_NRM0) != (s_prevcomponents & VB_HAS_NRM0)) // if ((m_components & VB_HAS_NRM0) != (s_prevcomponents & VB_HAS_NRM0))
{ {
if (components & VB_HAS_NRM0) if (m_components & VB_HAS_NRM0)
glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_NORMAL_ARRAY);
else else
glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_NORMAL_ARRAY);
} }
if ((components & VB_HAS_NRM1) != (s_prevcomponents & VB_HAS_NRM1)) // if ((m_components & VB_HAS_NRM1) != (s_prevcomponents & VB_HAS_NRM1))
{ {
if (components & VB_HAS_NRM1) { if (m_components & VB_HAS_NRM1) {
glEnableVertexAttribArray(SHADER_NORM1_ATTRIB); glEnableVertexAttribArray(SHADER_NORM1_ATTRIB);
glEnableVertexAttribArray(SHADER_NORM2_ATTRIB); glEnableVertexAttribArray(SHADER_NORM2_ATTRIB);
} }
@ -259,9 +257,9 @@ void GLVertexFormat::EnableComponents(u32 components)
// color // color
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
{ {
if ((components & (VB_HAS_COL0 << i)) != (s_prevcomponents & (VB_HAS_COL0 << i))) // if ((m_components & (VB_HAS_COL0 << i)) != (s_prevcomponents & (VB_HAS_COL0 << i)))
{ {
if (components & (VB_HAS_COL0 << i)) if (m_components & (VB_HAS_COL0 << i))
glEnableClientState(i ? GL_SECONDARY_COLOR_ARRAY : GL_COLOR_ARRAY); glEnableClientState(i ? GL_SECONDARY_COLOR_ARRAY : GL_COLOR_ARRAY);
else else
glDisableClientState(i ? GL_SECONDARY_COLOR_ARRAY : GL_COLOR_ARRAY); glDisableClientState(i ? GL_SECONDARY_COLOR_ARRAY : GL_COLOR_ARRAY);
@ -271,12 +269,16 @@ void GLVertexFormat::EnableComponents(u32 components)
// tex // tex
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {
if ((components & (VB_HAS_UV0 << i)) != (s_prevcomponents & (VB_HAS_UV0 << i))) // if ((m_components & (VB_HAS_UV0 << i)) != (s_prevcomponents & (VB_HAS_UV0 << i)))
{ {
glClientActiveTexture(GL_TEXTURE0 + i); glClientActiveTexture(GL_TEXTURE0 + i);
if (m_components & (VB_HAS_UV0 << i))
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
else
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
} }
s_prevcomponents = components; s_prevcomponents = m_components;
} }
} }

View File

@ -474,7 +474,6 @@ Renderer::Renderer()
glBlendColorEXT(0, 0, 0, 0.5f); glBlendColorEXT(0, 0, 0, 0.5f);
glClearDepth(1.0f); glClearDepth(1.0f);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// legacy multitexturing: select texture channel only. // legacy multitexturing: select texture channel only.
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glClientActiveTexture(GL_TEXTURE0); glClientActiveTexture(GL_TEXTURE0);
@ -578,6 +577,19 @@ void Renderer::DrawDebugInfo()
RectPoints[a * 16 + 15] = y2; RectPoints[a * 16 + 15] = y2;
} }
// disable all pointer, TODO: use VAO
glEnableClientState(GL_VERTEX_ARRAY);
glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableVertexAttribArray(SHADER_NORM1_ATTRIB);
glDisableVertexAttribArray(SHADER_NORM2_ATTRIB);
glEnableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_SECONDARY_COLOR_ARRAY);
for(int i=0; i<8; i++) {
glClientActiveTexture(GL_TEXTURE0 + i);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glColorPointer (3, GL_FLOAT, 0, Colours); glColorPointer (3, GL_FLOAT, 0, Colours);
glVertexPointer(2, GL_FLOAT, 0, RectPoints); glVertexPointer(2, GL_FLOAT, 0, RectPoints);
glDrawArrays(GL_LINE_STRIP, 0, stats.efb_regions.size() * 8); glDrawArrays(GL_LINE_STRIP, 0, stats.efb_regions.size() * 8);
@ -1160,11 +1172,26 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
1.0f, 0.0f 1.0f, 0.0f
}; };
// disable all pointer, TODO: use VAO
glEnableClientState(GL_VERTEX_ARRAY);
glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableVertexAttribArray(SHADER_NORM1_ATTRIB);
glDisableVertexAttribArray(SHADER_NORM2_ATTRIB);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_SECONDARY_COLOR_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for(int i=1; i<8; i++) {
glClientActiveTexture(GL_TEXTURE0 + i);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
if (applyShader) if (applyShader)
{ {
glClientActiveTexture(GL_TEXTURE1); glClientActiveTexture(GL_TEXTURE1);
glTexCoordPointer(2, GL_FLOAT, 0, tex2); glTexCoordPointer(2, GL_FLOAT, 0, tex2);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
} }
glVertexPointer(3, GL_FLOAT, 0, vtx1); glVertexPointer(3, GL_FLOAT, 0, vtx1);

View File

@ -319,6 +319,21 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
1.f, 1.f 1.f, 1.f
}; };
// disable all pointer, TODO: use VAO
glEnableClientState(GL_VERTEX_ARRAY);
glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableVertexAttribArray(SHADER_NORM1_ATTRIB);
glDisableVertexAttribArray(SHADER_NORM2_ATTRIB);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_SECONDARY_COLOR_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for(int i=1; i<8; i++) {
glClientActiveTexture(GL_TEXTURE0 + i);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glClientActiveTexture(GL_TEXTURE0); glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(2, GL_FLOAT, 0, tex1); glTexCoordPointer(2, GL_FLOAT, 0, tex1);
glVertexPointer(2, GL_FLOAT, 0, vtx1); glVertexPointer(2, GL_FLOAT, 0, vtx1);

View File

@ -228,6 +228,21 @@ void EncodeToRamUsingShader(FRAGMENTSHADER& shader, GLuint srcTexture, const Tar
1.f, -1.f 1.f, -1.f
}; };
// disable all pointer, TODO: use VAO
glEnableClientState(GL_VERTEX_ARRAY);
glDisableVertexAttribArray(SHADER_POSMTX_ATTRIB);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableVertexAttribArray(SHADER_NORM1_ATTRIB);
glDisableVertexAttribArray(SHADER_NORM2_ATTRIB);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_SECONDARY_COLOR_ARRAY);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for(int i=1; i<8; i++) {
glClientActiveTexture(GL_TEXTURE0 + i);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
glClientActiveTexture(GL_TEXTURE0); glClientActiveTexture(GL_TEXTURE0);
glTexCoordPointer(2, GL_FLOAT, 0, tex1); glTexCoordPointer(2, GL_FLOAT, 0, tex1);
glVertexPointer(2, GL_FLOAT, 0, vtx1); glVertexPointer(2, GL_FLOAT, 0, vtx1);

View File

@ -64,9 +64,6 @@ VertexManager::VertexManager()
// max_Index_size = MAXIBUFFERSIZE; // max_Index_size = MAXIBUFFERSIZE;
// //
//GL_REPORT_ERRORD(); //GL_REPORT_ERRORD();
glEnableClientState(GL_VERTEX_ARRAY);
GL_REPORT_ERRORD();
} }
void VertexManager::CreateDeviceObjects() void VertexManager::CreateDeviceObjects()