GLES: Fix texture MapBuffer and AllocateBuffer create client side memory.

This commit is contained in:
Emile Belanger 2021-09-25 14:31:25 +01:00 committed by Rachael Alexanderson
parent b59554f319
commit 8f54de99e0
2 changed files with 46 additions and 10 deletions

View file

@ -81,12 +81,11 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
int texformat = GL_RGBA;// TexFormat[gl_texture_format]; int texformat = GL_RGBA;// TexFormat[gl_texture_format];
bool deletebuffer=false; bool deletebuffer=false;
/* // When running in SW mode buffer will be null, so set it to the texBuffer already created
if (forcenocompression) // There could be other use cases I do not know about which means this is a bad idea..
{ if (buffer == nullptr)
texformat = GL_RGBA8; buffer = texBuffer;
}
*/
bool firstCall = glTexID == 0; bool firstCall = glTexID == 0;
if (firstCall) if (firstCall)
{ {
@ -136,9 +135,19 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
sourcetype = GL_BGRA; sourcetype = GL_BGRA;
texformat = GL_BGRA; texformat = GL_BGRA;
#else #else
sourcetype = GL_BGRA; if (glTextureBytes == 1)
texformat = GL_RGBA; {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
sourcetype = GL_RED;
texformat = GL_R8;
}
else
{
sourcetype = GL_BGRA;
texformat = GL_RGBA;
}
#endif #endif
glTexImage2D(GL_TEXTURE_2D, 0, texformat, rw, rh, 0, sourcetype, GL_UNSIGNED_BYTE, buffer); glTexImage2D(GL_TEXTURE_2D, 0, texformat, rw, rh, 0, sourcetype, GL_UNSIGNED_BYTE, buffer);
if (deletebuffer && buffer) free(buffer); if (deletebuffer && buffer) free(buffer);
@ -155,6 +164,26 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
} }
void FHardwareTexture::AllocateBuffer(int w, int h, int texelsize)
{
int rw = GetTexDimension(w);
int rh = GetTexDimension(h);
if (texelsize < 1 || texelsize > 4) texelsize = 4;
glTextureBytes = texelsize;
bufferpitch = w;
if (texBuffer)
delete[] texBuffer;
texBuffer = new uint8_t[(w * h) * texelsize];
return;
}
uint8_t* FHardwareTexture::MapBuffer()
{
return texBuffer;
}
//=========================================================================== //===========================================================================
// //
@ -164,6 +193,9 @@ unsigned int FHardwareTexture::CreateTexture(unsigned char * buffer, int w, int
FHardwareTexture::~FHardwareTexture() FHardwareTexture::~FHardwareTexture()
{ {
if (glTexID != 0) glDeleteTextures(1, &glTexID); if (glTexID != 0) glDeleteTextures(1, &glTexID);
if (texBuffer)
delete[] texBuffer;
} }

View file

@ -42,6 +42,8 @@ private:
unsigned int glTexID = 0; unsigned int glTexID = 0;
unsigned int glDepthID = 0; // only used by camera textures unsigned int glDepthID = 0; // only used by camera textures
uint8_t* texBuffer;
int glTextureBytes; int glTextureBytes;
bool mipmapped = false; bool mipmapped = false;
@ -52,6 +54,8 @@ public:
{ {
forcenofilter = disablefilter; forcenofilter = disablefilter;
glTextureBytes = numchannels; glTextureBytes = numchannels;
texBuffer = nullptr;
} }
~FHardwareTexture(); ~FHardwareTexture();
@ -64,8 +68,8 @@ public:
unsigned int Bind(int texunit, 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);
void AllocateBuffer(int w, int h, int texelsize) {} // Not used void AllocateBuffer(int w, int h, int texelsize);
uint8_t* MapBuffer() { return 0; } // Not used uint8_t* MapBuffer();
unsigned int CreateTexture(unsigned char* buffer, int w, int h, int texunit, bool mipmap, const char* name); unsigned int CreateTexture(unsigned char* buffer, int w, int h, int texunit, bool mipmap, const char* name);
unsigned int GetTextureHandle() unsigned int GetTextureHandle()