mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 03:50: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() {} | ||||
| 
 | ||||
|    void InitializeGL(); | ||||
| 
 | ||||
|    static std::size_t | ||||
|    GetShaderKey(std::initializer_list<std::pair<GLenum, std::string>> shaders); | ||||
| 
 | ||||
|    gl::OpenGLFunctions gl_; | ||||
| 
 | ||||
|    bool glInitialized_ {false}; | ||||
| 
 | ||||
|    std::unordered_map<std::size_t, std::shared_ptr<gl::ShaderProgram>> | ||||
|               shaderProgramMap_; | ||||
|    std::mutex shaderProgramMutex_; | ||||
|  | @ -57,6 +61,18 @@ std::uint64_t GlContext::texture_buffer_count() const | |||
|    return p->textureBufferCount_; | ||||
| } | ||||
| 
 | ||||
| void GlContext::Impl::InitializeGL() | ||||
| { | ||||
|    if (glInitialized_) | ||||
|    { | ||||
|       return; | ||||
|    } | ||||
| 
 | ||||
|    gl_.glGenTextures(1, &textureAtlas_); | ||||
| 
 | ||||
|    glInitialized_ = true; | ||||
| } | ||||
| 
 | ||||
| std::shared_ptr<gl::ShaderProgram> | ||||
| GlContext::GetShaderProgram(const std::string& vertexPath, | ||||
|                             const std::string& fragmentPath) | ||||
|  | @ -91,15 +107,16 @@ std::shared_ptr<gl::ShaderProgram> GlContext::GetShaderProgram( | |||
| 
 | ||||
| GLuint GlContext::GetTextureAtlas() | ||||
| { | ||||
|    p->InitializeGL(); | ||||
| 
 | ||||
|    std::unique_lock lock(p->textureMutex_); | ||||
| 
 | ||||
|    auto& textureAtlas = util::TextureAtlas::Instance(); | ||||
| 
 | ||||
|    if (p->textureAtlas_ == GL_INVALID_INDEX || | ||||
|        p->textureBufferCount_ != textureAtlas.BuildCount()) | ||||
|    if (p->textureBufferCount_ != textureAtlas.BuildCount()) | ||||
|    { | ||||
|       p->textureBufferCount_ = textureAtlas.BuildCount(); | ||||
|       p->textureAtlas_       = textureAtlas.BufferAtlas(p->gl_); | ||||
|       textureAtlas.BufferAtlas(p->gl_, p->textureAtlas_); | ||||
|    } | ||||
| 
 | ||||
|    return p->textureAtlas_; | ||||
|  |  | |||
|  | @ -323,10 +323,8 @@ void TextureAtlas::BuildAtlas(std::size_t width, std::size_t height) | |||
|    ++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_); | ||||
| 
 | ||||
|    if (p->atlasArray_.size() > 0u && p->atlasArray_[0].width() > 0 && | ||||
|  | @ -354,7 +352,6 @@ GLuint TextureAtlas::BufferAtlas(gl::OpenGLFunctions& gl) | |||
| 
 | ||||
|       lock.unlock(); | ||||
| 
 | ||||
|       gl.glGenTextures(1, &texture); | ||||
|       gl.glBindTexture(GL_TEXTURE_2D_ARRAY, texture); | ||||
| 
 | ||||
|       gl.glTexParameteri( | ||||
|  | @ -375,8 +372,6 @@ GLuint TextureAtlas::BufferAtlas(gl::OpenGLFunctions& gl) | |||
|                       GL_UNSIGNED_BYTE, | ||||
|                       pixelData.data()); | ||||
|    } | ||||
| 
 | ||||
|    return texture; | ||||
| } | ||||
| 
 | ||||
| TextureAttributes TextureAtlas::GetTextureAttributes(const std::string& name) | ||||
|  |  | |||
|  | @ -72,10 +72,10 @@ public: | |||
| 
 | ||||
|    std::uint64_t BuildCount() const; | ||||
| 
 | ||||
|    void   RegisterTexture(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); | ||||
|    GLuint BufferAtlas(gl::OpenGLFunctions& gl); | ||||
|    void RegisterTexture(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 BufferAtlas(gl::OpenGLFunctions& gl, GLuint texture); | ||||
| 
 | ||||
|    TextureAttributes GetTextureAttributes(const std::string& name); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat