From 4c68bf1bb62bd5d6210b60f341fa827e9d7c7ec3 Mon Sep 17 00:00:00 2001 From: hobby8 Date: Fri, 4 Dec 2015 12:04:20 +0200 Subject: [PATCH] Skip glTexCoordPointer() call if not needed --- include/SFML/Graphics/RenderTarget.hpp | 1 + src/SFML/Graphics/RenderTarget.cpp | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/SFML/Graphics/RenderTarget.hpp b/include/SFML/Graphics/RenderTarget.hpp index eb02355278..0dd7177232 100644 --- a/include/SFML/Graphics/RenderTarget.hpp +++ b/include/SFML/Graphics/RenderTarget.hpp @@ -406,6 +406,7 @@ class SFML_GRAPHICS_API RenderTarget : NonCopyable bool viewChanged; ///< Has the current view changed since last draw? BlendMode lastBlendMode; ///< Cached blending mode Uint64 lastTextureId; ///< Cached texture + bool texCoordsArrayEnabled; ///< Is GL_TEXTURE_COORD_ARRAY client state enabled? bool useVertexCache; ///< Did we previously use the vertex cache? Vertex vertexCache[VertexCacheSize]; ///< Pre-transformed vertices cache }; diff --git a/src/SFML/Graphics/RenderTarget.cpp b/src/SFML/Graphics/RenderTarget.cpp index ded377c1db..acf741dc96 100644 --- a/src/SFML/Graphics/RenderTarget.cpp +++ b/src/SFML/Graphics/RenderTarget.cpp @@ -269,13 +269,25 @@ void RenderTarget::draw(const Vertex* vertices, std::size_t vertexCount, vertices = NULL; } + // Check if texture coordinates array is needed, and update client state accordingly + bool enableTexCoordsArray = (states.texture || states.shader); + if (enableTexCoordsArray != m_cache.texCoordsArrayEnabled) + { + if (enableTexCoordsArray) + glCheck(glEnableClientState(GL_TEXTURE_COORD_ARRAY)); + else + glCheck(glDisableClientState(GL_TEXTURE_COORD_ARRAY)); + m_cache.texCoordsArrayEnabled = enableTexCoordsArray; + } + // Setup the pointers to the vertices' components if (vertices) { const char* data = reinterpret_cast(vertices); glCheck(glVertexPointer(2, GL_FLOAT, sizeof(Vertex), data + 0)); glCheck(glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), data + 8)); - glCheck(glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), data + 12)); + if (enableTexCoordsArray) + glCheck(glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), data + 12)); } // Find the OpenGL primitive type @@ -390,6 +402,8 @@ void RenderTarget::resetGLStates() if (shaderAvailable) applyShader(NULL); + m_cache.texCoordsArrayEnabled = true; + m_cache.useVertexCache = false; // Set the default view