- cleaned out the FHardwareTexture class, now that the translations are finally handled on a higher level.

This commit is contained in:
Christoph Oelckers 2018-12-12 18:55:55 +01:00
parent c5447f0cdd
commit 173b8beb33
4 changed files with 30 additions and 177 deletions

View file

@ -510,7 +510,7 @@ FTexture *OpenGLFrameBuffer::WipeStartScreen()
auto tex = new FWrapperTexture(viewport.width, viewport.height, 1); auto tex = new FWrapperTexture(viewport.width, viewport.height, 1);
tex->GetSystemTexture()->CreateTexture(nullptr, viewport.width, viewport.height, 0, false, 0, "WipeStartScreen"); tex->GetSystemTexture()->CreateTexture(nullptr, viewport.width, viewport.height, 0, false, 0, "WipeStartScreen");
glFinish(); glFinish();
static_cast<FHardwareTexture*>(tex->GetSystemTexture())->Bind(0, false, false); static_cast<FHardwareTexture*>(tex->GetSystemTexture())->Bind(0, false);
GLRenderer->mBuffers->BindCurrentFB(); GLRenderer->mBuffers->BindCurrentFB();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, viewport.left, viewport.top, viewport.width, viewport.height); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, viewport.left, viewport.top, viewport.width, viewport.height);
@ -532,7 +532,7 @@ FTexture *OpenGLFrameBuffer::WipeEndScreen()
auto tex = new FWrapperTexture(viewport.width, viewport.height, 1); auto tex = new FWrapperTexture(viewport.width, viewport.height, 1);
tex->GetSystemTexture()->CreateTexture(NULL, viewport.width, viewport.height, 0, false, 0, "WipeEndScreen"); tex->GetSystemTexture()->CreateTexture(NULL, viewport.width, viewport.height, 0, false, 0, "WipeEndScreen");
glFinish(); glFinish();
static_cast<FHardwareTexture*>(tex->GetSystemTexture())->Bind(0, false, false); static_cast<FHardwareTexture*>(tex->GetSystemTexture())->Bind(0, false);
GLRenderer->mBuffers->BindCurrentFB(); GLRenderer->mBuffers->BindCurrentFB();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, viewport.left, viewport.top, viewport.width, viewport.height); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, viewport.left, viewport.top, viewport.width, viewport.height);
return tex; return tex;

View file

@ -96,17 +96,16 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
texformat = GL_RGBA8; texformat = GL_RGBA8;
} }
*/ */
TranslatedTexture * glTex=GetTexID(translation); bool firstCall = glTexID == 0;
bool firstCall = glTex->glTexID == 0; if (firstCall) glGenTextures(1,&glTexID);
if (firstCall) glGenTextures(1,&glTex->glTexID);
int textureBinding = UINT_MAX; int textureBinding = UINT_MAX;
if (texunit == -1) glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); if (texunit == -1) glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding);
if (texunit > 0) glActiveTexture(GL_TEXTURE0+texunit); if (texunit > 0) glActiveTexture(GL_TEXTURE0+texunit);
if (texunit >= 0) lastbound[texunit] = glTex->glTexID; if (texunit >= 0) lastbound[texunit] = glTexID;
glBindTexture(GL_TEXTURE_2D, glTex->glTexID); glBindTexture(GL_TEXTURE_2D, glTexID);
FGLDebug::LabelObject(GL_TEXTURE, glTex->glTexID, name); FGLDebug::LabelObject(GL_TEXTURE, glTexID, name);
rw = GetTexDimension(w); rw = GetTexDimension(w);
rh = GetTexDimension(h); rh = GetTexDimension(h);
@ -118,7 +117,7 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
else if (!buffer) else if (!buffer)
{ {
// The texture must at least be initialized if no data is present. // The texture must at least be initialized if no data is present.
glTex->mipmapped = false; mipmapped = false;
buffer=(unsigned char *)calloc(4,rw * (rh+1)); buffer=(unsigned char *)calloc(4,rw * (rh+1));
deletebuffer=true; deletebuffer=true;
//texheight=-h; //texheight=-h;
@ -169,12 +168,12 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
if (mipmap && TexFilter[gl_texture_filter].mipmapping) if (mipmap && TexFilter[gl_texture_filter].mipmapping)
{ {
glGenerateMipmap(GL_TEXTURE_2D); glGenerateMipmap(GL_TEXTURE_2D);
glTex->mipmapped = true; mipmapped = true;
} }
if (texunit > 0) glActiveTexture(GL_TEXTURE0); if (texunit > 0) glActiveTexture(GL_TEXTURE0);
else if (texunit == -1) glBindTexture(GL_TEXTURE_2D, textureBinding); else if (texunit == -1) glBindTexture(GL_TEXTURE_2D, textureBinding);
return glTex->glTexID; return glTexID;
} }
@ -205,66 +204,6 @@ uint8_t *FHardwareTexture::MapBuffer()
return (uint8_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); return (uint8_t*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
} }
//===========================================================================
//
// Creates a texture
//
//===========================================================================
FHardwareTexture::FHardwareTexture(bool nocompression)
{
forcenocompression = nocompression;
glDefTex.glTexID = 0;
glDefTex.translation = 0;
glDefTex.mipmapped = false;
glDepthID = 0;
}
//===========================================================================
//
// Deletes a texture id and unbinds it from the texture units
//
//===========================================================================
void FHardwareTexture::TranslatedTexture::Delete()
{
if (glTexID != 0)
{
for(int i = 0; i < MAX_TEXTURES; i++)
{
if (lastbound[i] == glTexID)
{
lastbound[i] = 0;
}
}
glDeleteTextures(1, &glTexID);
glTexID = 0;
mipmapped = false;
}
}
//===========================================================================
//
// Frees all associated resources
//
//===========================================================================
void FHardwareTexture::Clean(bool all)
{
int cm_arraysize = CM_FIRSTSPECIALCOLORMAP + SpecialColormaps.Size();
if (all)
{
glDefTex.Delete();
}
for(unsigned int i=0;i<glTex_Translated.Size();i++)
{
glTex_Translated[i].Delete();
}
glTex_Translated.Clear();
if (glDepthID != 0) glDeleteRenderbuffers(1, &glDepthID);
glDepthID = 0;
}
//=========================================================================== //===========================================================================
// //
// Destroys the texture // Destroys the texture
@ -272,72 +211,38 @@ void FHardwareTexture::Clean(bool all)
//=========================================================================== //===========================================================================
FHardwareTexture::~FHardwareTexture() FHardwareTexture::~FHardwareTexture()
{ {
Clean(true);
glDeleteBuffers(1, &glBufferID); glDeleteBuffers(1, &glBufferID);
} }
//===========================================================================
//
// Gets a texture ID address and validates all required data
//
//===========================================================================
FHardwareTexture::TranslatedTexture *FHardwareTexture::GetTexID(int translation)
{
if (translation == 0)
{
return &glDefTex;
}
// normally there aren't more than very few different
// translations here so this isn't performance critical.
for (unsigned int i = 0; i < glTex_Translated.Size(); i++)
{
if (glTex_Translated[i].translation == translation)
{
return &glTex_Translated[i];
}
}
int add = glTex_Translated.Reserve(1);
glTex_Translated[add].translation = translation;
glTex_Translated[add].glTexID = 0;
glTex_Translated[add].mipmapped = false;
return &glTex_Translated[add];
}
//=========================================================================== //===========================================================================
// //
// Binds this patch // Binds this patch
// //
//=========================================================================== //===========================================================================
unsigned int FHardwareTexture::Bind(int texunit, int translation, bool needmipmap) unsigned int FHardwareTexture::Bind(int texunit, bool needmipmap)
{ {
TranslatedTexture *pTex = GetTexID(translation); if (glTexID != 0)
if (pTex->glTexID != 0)
{ {
if (lastbound[texunit] == pTex->glTexID) return pTex->glTexID; if (lastbound[texunit] == glTexID) return glTexID;
lastbound[texunit] = pTex->glTexID; lastbound[texunit] = glTexID;
if (texunit != 0) glActiveTexture(GL_TEXTURE0 + texunit); if (texunit != 0) glActiveTexture(GL_TEXTURE0 + texunit);
glBindTexture(GL_TEXTURE_2D, pTex->glTexID); glBindTexture(GL_TEXTURE_2D, glTexID);
// Check if we need mipmaps on a texture that was creted without them. // Check if we need mipmaps on a texture that was creted without them.
if (needmipmap && !pTex->mipmapped && TexFilter[gl_texture_filter].mipmapping) if (needmipmap && !mipmapped && TexFilter[gl_texture_filter].mipmapping)
{ {
glGenerateMipmap(GL_TEXTURE_2D); glGenerateMipmap(GL_TEXTURE_2D);
pTex->mipmapped = true; mipmapped = true;
} }
if (texunit != 0) glActiveTexture(GL_TEXTURE0); if (texunit != 0) glActiveTexture(GL_TEXTURE0);
return pTex->glTexID; return glTexID;
} }
return 0; return 0;
} }
unsigned int FHardwareTexture::GetTextureHandle(int translation) unsigned int FHardwareTexture::GetTextureHandle(int translation)
{ {
TranslatedTexture *pTex = GetTexID(translation); return glTexID;
return pTex->glTexID;
} }
void FHardwareTexture::Unbind(int texunit) void FHardwareTexture::Unbind(int texunit)
@ -390,7 +295,7 @@ void FHardwareTexture::BindToFrameBuffer(int width, int height)
{ {
width = GetTexDimension(width); width = GetTexDimension(width);
height = GetTexDimension(height); height = GetTexDimension(height);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, glDefTex.glTexID, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, glTexID, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, GetDepthBuffer(width, height)); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, GetDepthBuffer(width, height));
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, GetDepthBuffer(width, height)); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, GetDepthBuffer(width, height));
} }
@ -419,7 +324,7 @@ bool FHardwareTexture::BindOrCreate(FTexture *tex, int texunit, int clampmode, i
bool needmipmap = (clampmode <= CLAMP_XY); bool needmipmap = (clampmode <= CLAMP_XY);
// Bind it to the system. // Bind it to the system.
if (!Bind(texunit, translation, needmipmap)) if (!Bind(texunit, needmipmap))
{ {
int w = 0, h = 0; int w = 0, h = 0;
@ -450,29 +355,4 @@ bool FHardwareTexture::BindOrCreate(FTexture *tex, int texunit, int clampmode, i
return true; return true;
} }
//===========================================================================
//
// Binds a texture to the renderer
//
//===========================================================================
bool FHardwareTexture::Exists(int translation)
{
int usebright = false;
if (translation <= 0)
{
translation = -translation;
}
else
{
auto remap = TranslationToTable(translation);
translation = remap == nullptr ? 0 : remap->GetUniqueIndex();
}
TranslatedTexture *pTex = GetTexID(translation);
return (pTex->glTexID != 0);
}
} }

View file

@ -19,31 +19,8 @@ class AActor;
namespace OpenGLRenderer namespace OpenGLRenderer
{ {
// For error catching while changing parameters.
enum EInvalid
{
Invalid = 0
};
class FHardwareTexture : public IHardwareTexture class FHardwareTexture : public IHardwareTexture
{ {
public:
enum
{
MAX_TEXTURES = 16
};
private:
struct TranslatedTexture
{
unsigned int glTexID;
int translation;
bool mipmapped;
void Delete();
};
public: public:
static unsigned int lastbound[MAX_TEXTURES]; static unsigned int lastbound[MAX_TEXTURES];
@ -60,18 +37,20 @@ private:
bool forcenocompression; bool forcenocompression;
TranslatedTexture glDefTex; unsigned int glTexID = 0;
TArray<TranslatedTexture> glTex_Translated; unsigned int glDepthID = 0; // only used by camera textures
unsigned int glDepthID; // only used by camera textures
unsigned int glBufferID = 0; unsigned int glBufferID = 0;
int glTextureBytes = 4; int glTextureBytes = 4;
bool mipmapped = false;
TranslatedTexture * GetTexID(int translation);
int GetDepthBuffer(int w, int h); int GetDepthBuffer(int w, int h);
public: public:
FHardwareTexture(bool nocompress); FHardwareTexture(bool nocompress)
{
forcenocompression = nocompress;
}
~FHardwareTexture(); ~FHardwareTexture();
static void Unbind(int texunit); static void Unbind(int texunit);
@ -79,18 +58,14 @@ public:
void BindToFrameBuffer(int w, int h); void BindToFrameBuffer(int w, int h);
unsigned int Bind(int texunit, int translation, bool needmipmap); unsigned int Bind(int texunit, bool needmipmap);
bool BindOrCreate(FTexture *tex, int texunit, int clampmode, int translation, int flags); bool BindOrCreate(FTexture *tex, int texunit, int clampmode, int translation, int flags);
bool Exists(int translation);
void AllocateBuffer(int w, int h, int texelsize); void AllocateBuffer(int w, int h, int texelsize);
uint8_t *MapBuffer(); uint8_t *MapBuffer();
unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const FString &name) = delete;
unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name); unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name);
unsigned int GetTextureHandle(int translation); unsigned int GetTextureHandle(int translation);
void Clean(bool all);
}; };
} }

View file

@ -25,8 +25,6 @@ public:
virtual uint8_t *MapBuffer() = 0; virtual uint8_t *MapBuffer() = 0;
virtual unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name) = 0; virtual unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name) = 0;
virtual void Clean(bool all) = 0;
void Resize(int swidth, int sheight, int width, int height, unsigned char *src_data, unsigned char *dst_data); void Resize(int swidth, int sheight, int width, int height, unsigned char *src_data, unsigned char *dst_data);
}; };