From 973ac8ddcd5eea22a01556405e16c554c7dd9788 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 83cef62b5..50bf7a6f0 100644 --- a/include/SFML/Graphics/RenderTarget.hpp +++ b/include/SFML/Graphics/RenderTarget.hpp @@ -414,6 +414,7 @@ private: 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 08009a586..244ee3021 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