OpenGL: remove small optimization

This one was introduced to reduce the glBindTexture and glActiveTexture calls. But it was quite a bit of logic and only an improvment on uploading/creating a texture, which is done rarely.
This commit is contained in:
degasus 2014-01-21 10:34:48 +01:00
parent fe02833f13
commit 60632fda6f
3 changed files with 10 additions and 33 deletions

View File

@ -52,7 +52,6 @@ static u32 s_DepthCbufid;
static u32 s_Textures[8]; static u32 s_Textures[8];
static u32 s_ActiveTexture; static u32 s_ActiveTexture;
static u32 s_NextStage;
bool SaveTexture(const std::string filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level) bool SaveTexture(const std::string filename, u32 textarget, u32 tex, int virtual_width, int virtual_height, unsigned int level)
{ {
@ -188,36 +187,26 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width,
entry.gl_type = gl_type; entry.gl_type = gl_type;
entry.pcfmt = pcfmt; entry.pcfmt = pcfmt;
entry.m_tex_levels = tex_levels; glActiveTexture(GL_TEXTURE0+9);
glBindTexture(GL_TEXTURE_2D, entry.texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex_levels - 1);
entry.Load(width, height, expanded_width, 0); entry.Load(width, height, expanded_width, 0);
// This isn't needed as Load() also reset the stage in the end
//TextureCache::SetStage();
return &entry; return &entry;
} }
void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height, void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height,
unsigned int expanded_width, unsigned int level) unsigned int expanded_width, unsigned int level)
{ {
if (s_ActiveTexture != s_NextStage)
{
glActiveTexture(GL_TEXTURE0 + s_NextStage);
s_ActiveTexture = s_NextStage;
}
if (s_Textures[s_NextStage] != texture)
{
glBindTexture(GL_TEXTURE_2D, texture);
s_Textures[s_NextStage] = texture;
}
// TODO: sloppy, just do this on creation?
if (level == 0)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, m_tex_levels - 1);
}
if (pcfmt != PC_TEX_FMT_DXT1) if (pcfmt != PC_TEX_FMT_DXT1)
{ {
glActiveTexture(GL_TEXTURE0+9);
glBindTexture(GL_TEXTURE_2D, texture);
if (expanded_width != width) if (expanded_width != width)
glPixelStorei(GL_UNPACK_ROW_LENGTH, expanded_width); glPixelStorei(GL_UNPACK_ROW_LENGTH, expanded_width);
@ -232,6 +221,7 @@ void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height,
//glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, //glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,
//width, height, 0, expanded_width * expanded_height/2, temp); //width, height, 0, expanded_width * expanded_height/2, temp);
} }
TextureCache::SetStage();
GL_REPORT_ERRORD(); GL_REPORT_ERRORD();
} }
@ -249,7 +239,6 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture(
gl_type = GL_UNSIGNED_BYTE; gl_type = GL_UNSIGNED_BYTE;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
entry->m_tex_levels = 1;
glTexImage2D(GL_TEXTURE_2D, 0, gl_iformat, scaled_tex_w, scaled_tex_h, 0, gl_format, gl_type, NULL); glTexImage2D(GL_TEXTURE_2D, 0, gl_iformat, scaled_tex_w, scaled_tex_h, 0, gl_format, gl_type, NULL);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
@ -400,7 +389,6 @@ TextureCache::TextureCache()
s_DepthCopyPositionUniform = glGetUniformLocation(s_DepthMatrixProgram.glprogid, "copy_position"); s_DepthCopyPositionUniform = glGetUniformLocation(s_DepthMatrixProgram.glprogid, "copy_position");
s_ActiveTexture = -1; s_ActiveTexture = -1;
s_NextStage = -1;
for(auto& gtex : s_Textures) for(auto& gtex : s_Textures)
gtex = -1; gtex = -1;
} }
@ -423,11 +411,4 @@ void TextureCache::SetStage ()
glActiveTexture(GL_TEXTURE0 + s_ActiveTexture); glActiveTexture(GL_TEXTURE0 + s_ActiveTexture);
} }
void TextureCache::SetNextStage ( unsigned int stage )
{
s_NextStage = stage;
}
} }

View File

@ -22,7 +22,6 @@ public:
TextureCache(); TextureCache();
static void DisableStage(unsigned int stage); static void DisableStage(unsigned int stage);
static void SetStage(); static void SetStage();
static void SetNextStage(unsigned int stage);
private: private:
struct TCacheEntry : TCacheEntryBase struct TCacheEntry : TCacheEntryBase
@ -36,8 +35,6 @@ private:
int gl_iformat; int gl_iformat;
int gl_type; int gl_type;
int m_tex_levels;
//TexMode0 mode; // current filter and clamp modes that texture is set to //TexMode0 mode; // current filter and clamp modes that texture is set to
//TexMode1 mode1; // current filter and clamp modes that texture is set to //TexMode1 mode1; // current filter and clamp modes that texture is set to

View File

@ -180,7 +180,6 @@ void VertexManager::vFlush()
{ {
if (usedtextures & (1 << i)) if (usedtextures & (1 << i))
{ {
TextureCache::SetNextStage(i);
g_renderer->SetSamplerState(i % 4, i / 4); g_renderer->SetSamplerState(i % 4, i / 4);
FourTexUnits &tex = bpmem.tex[i >> 2]; FourTexUnits &tex = bpmem.tex[i >> 2];
TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i,