mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-30 21:30:05 +00:00 
			
		
		
		
	Don't call glGenTextures every time the texture atlas updates
This commit is contained in:
		
							parent
							
								
									d78e650368
								
							
						
					
					
						commit
						555fbf479a
					
				
					 3 changed files with 25 additions and 13 deletions
				
			
		|  | @ -26,11 +26,15 @@ public: | ||||||
|    } |    } | ||||||
|    ~Impl() {} |    ~Impl() {} | ||||||
| 
 | 
 | ||||||
|  |    void InitializeGL(); | ||||||
|  | 
 | ||||||
|    static std::size_t |    static std::size_t | ||||||
|    GetShaderKey(std::initializer_list<std::pair<GLenum, std::string>> shaders); |    GetShaderKey(std::initializer_list<std::pair<GLenum, std::string>> shaders); | ||||||
| 
 | 
 | ||||||
|    gl::OpenGLFunctions gl_; |    gl::OpenGLFunctions gl_; | ||||||
| 
 | 
 | ||||||
|  |    bool glInitialized_ {false}; | ||||||
|  | 
 | ||||||
|    std::unordered_map<std::size_t, std::shared_ptr<gl::ShaderProgram>> |    std::unordered_map<std::size_t, std::shared_ptr<gl::ShaderProgram>> | ||||||
|               shaderProgramMap_; |               shaderProgramMap_; | ||||||
|    std::mutex shaderProgramMutex_; |    std::mutex shaderProgramMutex_; | ||||||
|  | @ -57,6 +61,18 @@ std::uint64_t GlContext::texture_buffer_count() const | ||||||
|    return p->textureBufferCount_; |    return p->textureBufferCount_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void GlContext::Impl::InitializeGL() | ||||||
|  | { | ||||||
|  |    if (glInitialized_) | ||||||
|  |    { | ||||||
|  |       return; | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    gl_.glGenTextures(1, &textureAtlas_); | ||||||
|  | 
 | ||||||
|  |    glInitialized_ = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::shared_ptr<gl::ShaderProgram> | std::shared_ptr<gl::ShaderProgram> | ||||||
| GlContext::GetShaderProgram(const std::string& vertexPath, | GlContext::GetShaderProgram(const std::string& vertexPath, | ||||||
|                             const std::string& fragmentPath) |                             const std::string& fragmentPath) | ||||||
|  | @ -91,15 +107,16 @@ std::shared_ptr<gl::ShaderProgram> GlContext::GetShaderProgram( | ||||||
| 
 | 
 | ||||||
| GLuint GlContext::GetTextureAtlas() | GLuint GlContext::GetTextureAtlas() | ||||||
| { | { | ||||||
|  |    p->InitializeGL(); | ||||||
|  | 
 | ||||||
|    std::unique_lock lock(p->textureMutex_); |    std::unique_lock lock(p->textureMutex_); | ||||||
| 
 | 
 | ||||||
|    auto& textureAtlas = util::TextureAtlas::Instance(); |    auto& textureAtlas = util::TextureAtlas::Instance(); | ||||||
| 
 | 
 | ||||||
|    if (p->textureAtlas_ == GL_INVALID_INDEX || |    if (p->textureBufferCount_ != textureAtlas.BuildCount()) | ||||||
|        p->textureBufferCount_ != textureAtlas.BuildCount()) |  | ||||||
|    { |    { | ||||||
|       p->textureBufferCount_ = textureAtlas.BuildCount(); |       p->textureBufferCount_ = textureAtlas.BuildCount(); | ||||||
|       p->textureAtlas_       = textureAtlas.BufferAtlas(p->gl_); |       textureAtlas.BufferAtlas(p->gl_, p->textureAtlas_); | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    return p->textureAtlas_; |    return p->textureAtlas_; | ||||||
|  |  | ||||||
|  | @ -323,10 +323,8 @@ void TextureAtlas::BuildAtlas(std::size_t width, std::size_t height) | ||||||
|    ++p->buildCount_; |    ++p->buildCount_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GLuint TextureAtlas::BufferAtlas(gl::OpenGLFunctions& gl) | void TextureAtlas::BufferAtlas(gl::OpenGLFunctions& gl, GLuint texture) | ||||||
| { | { | ||||||
|    GLuint texture = GL_INVALID_INDEX; |  | ||||||
| 
 |  | ||||||
|    std::shared_lock lock(p->atlasMutex_); |    std::shared_lock lock(p->atlasMutex_); | ||||||
| 
 | 
 | ||||||
|    if (p->atlasArray_.size() > 0u && p->atlasArray_[0].width() > 0 && |    if (p->atlasArray_.size() > 0u && p->atlasArray_[0].width() > 0 && | ||||||
|  | @ -354,7 +352,6 @@ GLuint TextureAtlas::BufferAtlas(gl::OpenGLFunctions& gl) | ||||||
| 
 | 
 | ||||||
|       lock.unlock(); |       lock.unlock(); | ||||||
| 
 | 
 | ||||||
|       gl.glGenTextures(1, &texture); |  | ||||||
|       gl.glBindTexture(GL_TEXTURE_2D_ARRAY, texture); |       gl.glBindTexture(GL_TEXTURE_2D_ARRAY, texture); | ||||||
| 
 | 
 | ||||||
|       gl.glTexParameteri( |       gl.glTexParameteri( | ||||||
|  | @ -375,8 +372,6 @@ GLuint TextureAtlas::BufferAtlas(gl::OpenGLFunctions& gl) | ||||||
|                       GL_UNSIGNED_BYTE, |                       GL_UNSIGNED_BYTE, | ||||||
|                       pixelData.data()); |                       pixelData.data()); | ||||||
|    } |    } | ||||||
| 
 |  | ||||||
|    return texture; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| TextureAttributes TextureAtlas::GetTextureAttributes(const std::string& name) | TextureAttributes TextureAtlas::GetTextureAttributes(const std::string& name) | ||||||
|  |  | ||||||
|  | @ -72,10 +72,10 @@ public: | ||||||
| 
 | 
 | ||||||
|    std::uint64_t BuildCount() const; |    std::uint64_t BuildCount() const; | ||||||
| 
 | 
 | ||||||
|    void   RegisterTexture(const std::string& name, const std::string& path); |    void RegisterTexture(const std::string& name, const std::string& path); | ||||||
|    bool   CacheTexture(const std::string& name, const std::string& path); |    bool CacheTexture(const std::string& name, const std::string& path); | ||||||
|    void   BuildAtlas(std::size_t width, std::size_t height); |    void BuildAtlas(std::size_t width, std::size_t height); | ||||||
|    GLuint BufferAtlas(gl::OpenGLFunctions& gl); |    void BufferAtlas(gl::OpenGLFunctions& gl, GLuint texture); | ||||||
| 
 | 
 | ||||||
|    TextureAttributes GetTextureAttributes(const std::string& name); |    TextureAttributes GetTextureAttributes(const std::string& name); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat