diff --git a/platform/Windows/build.vcxproj b/platform/Windows/build.vcxproj
index 7ebd23e58..e708fcc5e 100644
--- a/platform/Windows/build.vcxproj
+++ b/platform/Windows/build.vcxproj
@@ -288,7 +288,6 @@
-
@@ -369,7 +368,6 @@
-
diff --git a/platform/Windows/build.vcxproj.filters b/platform/Windows/build.vcxproj.filters
index d0ac5278e..8d7db891f 100644
--- a/platform/Windows/build.vcxproj.filters
+++ b/platform/Windows/build.vcxproj.filters
@@ -158,9 +158,6 @@
Source Files
-
- Source Files
-
Source Files
@@ -370,9 +367,6 @@
Header Files
-
- Header Files
-
Header Files
diff --git a/source/build/include/mdsprite.h b/source/build/include/mdsprite.h
index d2e501339..20ad8f3b1 100644
--- a/source/build/include/mdsprite.h
+++ b/source/build/include/mdsprite.h
@@ -12,7 +12,7 @@ extern "C" {
#define SHARED_MODEL_DATA int32_t mdnum, shadeoff; \
float scale, bscale, zadd, yoffset; \
- GLuint *texid; \
+ FHardwareTexture **texid; \
int32_t flags;
#define IDMODEL_SHARED_DATA int32_t numframes, cframe, nframe, fpssc, usesalpha; \
@@ -24,6 +24,8 @@ extern "C" {
#define IDP2_MAGIC 0x32504449
#define IDP3_MAGIC 0x33504449
+class FHardwareTexture;
+
typedef struct
{
SHARED_MODEL_DATA;
@@ -44,7 +46,7 @@ typedef struct _mdskinmap_t
uint8_t palette, flags, filler[2]; // Build palette number, flags the same as hicreplctyp
int32_t skinnum, surfnum; // Skin identifier, surface number
char *fn; // Skin filename
- GLuint texid[HICTINT_MEMORY_COMBINATIONS]; // OpenGL texture numbers for effect variations
+ FHardwareTexture *texid[HICTINT_MEMORY_COMBINATIONS]; // OpenGL texture numbers for effect variations
struct _mdskinmap_t *next;
float param, specpower, specfactor;
} mdskinmap_t;
@@ -192,7 +194,7 @@ typedef struct
int32_t mdnum; //VOX=1, MD2=2, MD3=3. NOTE: must be first in structure!
int32_t shadeoff;
float scale, bscale, zadd;
- uint32_t *texid; // skins for palettes
+ FHardwareTexture **texid; // skins for palettes
int32_t flags;
//VOX specific stuff:
@@ -206,7 +208,7 @@ typedef struct
EXTERN mdmodel_t **models;
void updateanimation(md2model_t *m, const uspritetype *tspr, uint8_t lpal);
-int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf);
+FHardwareTexture *mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf);
void mdinit(void);
void freeallmodels(void);
void clearskins(int32_t type);
diff --git a/source/build/include/polymost.h b/source/build/include/polymost.h
index a6e9a9eae..2866beb09 100644
--- a/source/build/include/polymost.h
+++ b/source/build/include/polymost.h
@@ -13,6 +13,7 @@ void Polymost_CacheHitList(uint8_t* hash);
extern "C" {
#endif
+ class FHardwareTexture;
typedef struct { uint8_t r, g, b, a; } coltype;
typedef struct { float r, g, b, a; } coltypef;
@@ -33,11 +34,9 @@ extern struct glfiltermodes glfiltermodes[NUMGLFILTERMODES];
extern void Polymost_prepare_loadboard(void);
-void GetTextureHandle(GLuint *handle);
//void phex(char v, char *s);
-void uploadtexture(int32_t doalloc, vec2_t siz, int32_t texfmt, coltype *pic, vec2_t tsiz, int32_t dameth);
-void uploadtextureindexed(int32_t doalloc, vec2_t offset, vec2_t siz, intptr_t tile);
+void uploadtexture(FHardwareTexture *tex, int32_t doalloc, vec2_t siz, int32_t texfmt, coltype *pic, vec2_t tsiz, int32_t dameth);
void uploadbasepalette(int32_t basepalnum);
void uploadpalswap(int32_t palookupnum);
void polymost_drawsprite(int32_t snum);
@@ -57,16 +56,8 @@ void polymost_useColorOnly(char useColorOnly);
void polymost_usePaletteIndexing(char usePaletteIndexing);
void polymost_useDetailMapping(char useDetailMapping);
void polymost_useGlowMapping(char useGlowMapping);
-void polymost_activeTexture(GLenum texture);
-void polymost_bindTexture(GLenum target, uint32_t textureID);
void useShaderProgram(uint32_t shaderID);
-//POGOTODO: these wrappers won't be needed down the line -- remove them once proper draw call organization is finished
-#undef glActiveTexture
-#undef glBindTexture
-#define glActiveTexture polymost_activeTexture
-#define glBindTexture polymost_bindTexture
-
void polymost_glinit(void);
void polymost_glreset(void);
@@ -225,8 +216,7 @@ EDUKE32_STATIC_ASSERT(TO_DAMETH_ARTIMMUNITY(HICR_ARTIMMUNITY) == DAMETH_ARTIMMUN
// Do we want a NPOT-y-as-classic texture for this and ?
static FORCE_INLINE int polymost_want_npotytex(int32_t dameth, int32_t ysiz)
{
- return videoGetRenderMode() != REND_POLYMER && // r_npotwallmode NYI in Polymer
- polymost_is_npotmode() && (dameth&DAMETH_WALL) && check_nonpow2(ysiz);
+ return polymost_is_npotmode() && (dameth&DAMETH_WALL) && check_nonpow2(ysiz);
}
// pthtyp pth->flags bits
@@ -252,7 +242,7 @@ typedef struct pthtyp_t
struct pthtyp_t *ofb; // fullbright pixels
hicreplctyp *hicr;
- uint32_t glpic;
+ FHardwareTexture * glpic;
vec2f_t scale;
vec2_t siz;
int16_t picnum;
@@ -274,7 +264,7 @@ EDUKE32_STATIC_ASSERT(TO_PTH_NOTRANSFIX(DAMETH_TRANS1) == 0);
EDUKE32_STATIC_ASSERT(TO_PTH_NOTRANSFIX(DAMETH_MASKPROPS) == 0);
extern void gloadtile_art(int32_t,int32_t,int32_t,int32_t,int32_t,pthtyp *,int32_t);
-extern int32_t gloadtile_hi(int32_t,int32_t,int32_t,hicreplctyp *,int32_t,pthtyp *,int32_t,polytintflags_t);
+extern int32_t gloadtile_hi(int32_t,int32_t,int32_t,hicreplctyp *,int32_t,pthtyp *,int32_t, polytintflags_t);
extern int32_t globalnoeffect;
extern int32_t drawingskybox;
@@ -288,8 +278,8 @@ extern hitdata_t polymost_hitdata;
#include "texcache.h"
-extern void polymost_setupglowtexture(int32_t texunits, int32_t tex);
-extern void polymost_setupdetailtexture(int32_t texunits, int32_t tex);
+extern void polymost_setupglowtexture(int32_t texunits, FHardwareTexture *tex);
+extern void polymost_setupdetailtexture(int32_t texunits, FHardwareTexture* tex);
#ifdef __cplusplus
}
diff --git a/source/build/src/2d.cpp b/source/build/src/2d.cpp
index ba874519e..047a12df9 100644
--- a/source/build/src/2d.cpp
+++ b/source/build/src/2d.cpp
@@ -93,13 +93,6 @@ static void drawlinegl(int32_t x1, int32_t y1, int32_t x2, int32_t y2, palette_t
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, xdim, ydim, 0, -1, 1);
- if (videoGetRenderMode() == REND_POLYMER)
- {
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glDisable(GL_TEXTURE_2D);
- }
gloy1 = -1;
glDisable(GL_ALPHA_TEST);
@@ -1366,14 +1359,6 @@ void polymostSet2dView(void)
glLoadIdentity();
glOrtho(0, xdim, ydim, 0, -1, 1);
- if (videoGetRenderMode() == REND_POLYMER)
- {
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glDisable(GL_TEXTURE_2D);
- }
-
gloy1 = -1;
glDisable(GL_DEPTH_TEST);
diff --git a/source/build/src/animvpx.cpp b/source/build/src/animvpx.cpp
index fc4b2b177..b7d4e86e5 100644
--- a/source/build/src/animvpx.cpp
+++ b/source/build/src/animvpx.cpp
@@ -295,64 +295,36 @@ read_ivf_frame:
const int32_t ustride = img->stride[VPX_PLANE_U];
const int32_t vstride = img->stride[VPX_PLANE_V];
- if (glinfo.glsl) /*** 3 planes --> packed conversion ***/
+ /*** 3 planes --> packed conversion ***/
+ vec2u_t const dim = { img->d_w, img->d_h };
+
+ for (unsigned int y = 0; y < dim.y; y += 2)
{
- vec2u_t const dim = { img->d_w, img->d_h };
+ unsigned int const y1 = y + 1;
+ unsigned int const wy = dim.x * y;
+ unsigned int const wy1 = dim.x * y1;
- for (unsigned int y = 0; y < dim.y; y += 2)
+ for (unsigned int x = 0; x < dim.x; x += 2)
{
- unsigned int const y1 = y + 1;
- unsigned int const wy = dim.x * y;
- unsigned int const wy1 = dim.x * y1;
+ uint8_t u = uplane[ustride * (y >> 1) + (x >> 1)];
+ uint8_t v = vplane[vstride * (y >> 1) + (x >> 1)];
- for (unsigned int x = 0; x < dim.x; x += 2)
- {
- uint8_t u = uplane[ustride * (y >> 1) + (x >> 1)];
- uint8_t v = vplane[vstride * (y >> 1) + (x >> 1)];
+ dstpic[(wy + x) << 2] = yplane[ystride * y + x];
+ dstpic[(wy + x + 1) << 2] = yplane[ystride * y + x + 1];
+ dstpic[(wy1 + x) << 2] = yplane[ystride * y1 + x];
+ dstpic[(wy1 + x + 1) << 2] = yplane[ystride * y1 + x + 1];
- dstpic[(wy + x) << 2] = yplane[ystride * y + x];
- dstpic[(wy + x + 1) << 2] = yplane[ystride * y + x + 1];
- dstpic[(wy1 + x) << 2] = yplane[ystride * y1 + x];
- dstpic[(wy1 + x + 1) << 2] = yplane[ystride * y1 + x + 1];
+ dstpic[((wy + x) << 2) + 1] = u;
+ dstpic[((wy + x + 1) << 2) + 1] = u;
+ dstpic[((wy1 + x) << 2) + 1] = u;
+ dstpic[((wy1 + x + 1) << 2) + 1] = u;
- dstpic[((wy + x) << 2) + 1] = u;
- dstpic[((wy + x + 1) << 2) + 1] = u;
- dstpic[((wy1 + x) << 2) + 1] = u;
- dstpic[((wy1 + x + 1) << 2) + 1] = u;
-
- dstpic[((wy + x) << 2) + 2] = v;
- dstpic[((wy + x + 1) << 2) + 2] = v;
- dstpic[((wy1 + x) << 2) + 2] = v;
- dstpic[((wy1 + x + 1) << 2) + 2] = v;
- }
+ dstpic[((wy + x) << 2) + 2] = v;
+ dstpic[((wy + x + 1) << 2) + 2] = v;
+ dstpic[((wy1 + x) << 2) + 2] = v;
+ dstpic[((wy1 + x + 1) << 2) + 2] = v;
}
}
- else /*** 3 planes --> packed conversion (RGB) ***/
- {
- int i = 0;
-
- for (unsigned int imgY = 0; imgY < img->d_h; imgY++)
- {
- for (unsigned int imgX = 0; imgX < img->d_w; imgX++)
- {
- uint8_t const y = yplane[imgY * ystride + imgX];
- uint8_t const u = uplane[(imgY >> 1) * ustride + (imgX >> 1)];
- uint8_t const v = vplane[(imgY >> 1) * vstride + (imgX >> 1)];
-
- int const c = y - 16;
- int const d = (u + -128);
- int const e = (v + -128);
- int const c298 = c * 298;
-
- dstpic[i + 0] = (uint8_t)clamp((c298 + 409 * e - -128) >> 8, 0, 255);
- dstpic[i + 1] = (uint8_t)clamp((c298 - 100 * d - 208 * e - -128) >> 8, 0, 255);
- dstpic[i + 2] = (uint8_t)clamp((c298 + 516 * d - -128) >> 8, 0, 255);
-
- i += 3;
- }
- }
- }
-
t[2] = timerGetTicks();
codec->sumtimes[0] += t[1]-t[0];
@@ -367,7 +339,8 @@ read_ivf_frame:
/////////////// DRAWING! ///////////////
-static GLuint texname = 0;
+static FHardwareTexture* texture;
+static int sampler;
static int32_t texuploaded;
#ifdef USE_GLEXT
@@ -458,26 +431,17 @@ void animvpx_setup_glstate(int32_t animvpx_flags)
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
- glEnable(GL_TEXTURE_2D);
-#ifdef USE_GLEXT
- glActiveTexture(GL_TEXTURE0);
-#endif
- GetTextureHandle(&texname);
- glBindTexture(GL_TEXTURE_2D, texname);
+ texture = GLInterface.NewTexture();
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, glinfo.clamptoedge?GL_CLAMP_TO_EDGE:GL_CLAMP);
if ((animvpx_flags & CUTSCENE_TEXTUREFILTER && gltexfiltermode == TEXFILTER_ON) || animvpx_flags & CUTSCENE_FORCEFILTER ||
(!(animvpx_flags & CUTSCENE_TEXTUREFILTER) && !(animvpx_flags & CUTSCENE_FORCENOFILTER))) // if no flags, then use filter for IVFs
{
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ sampler = Sampler2DFiltered;
}
else
{
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ sampler = Sampler2DNoFilter;
}
texuploaded = 0;
@@ -499,8 +463,8 @@ void animvpx_restore_glstate(void)
// glPopAttrib();
- glDeleteTextures(1, &texname);
- texname = 0;
+ delete texture;
+ texture = nullptr;
texuploaded = 0;
}
@@ -514,21 +478,13 @@ int32_t animvpx_render_frame(animvpx_codec_ctx *codec, double animvpx_aspect)
if (codec->pic == NULL)
return 2; // shouldn't happen
- int fmt = glinfo.glsl ? GL_RGBA : GL_RGB;
-
if (!texuploaded)
{
- glTexImage2D(GL_TEXTURE_2D, 0, fmt, codec->width,codec->height,
- 0, fmt, GL_UNSIGNED_BYTE, codec->pic);
- if (glGetError() != GL_NO_ERROR) return 1;
+ texture->CreateTexture(codec->width, codec->height, false, false);
texuploaded = 1;
}
- else
- {
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0,0, codec->width,codec->height,
- fmt, GL_UNSIGNED_BYTE, codec->pic);
- if (glGetError() != GL_NO_ERROR) return 1;
- }
+ texture->LoadTexture(codec->pic);
+ GLInterface.BindTexture(0, texture, sampler);
float vid_wbyh = ((float)codec->width)/codec->height;
if (animvpx_aspect > 0)
diff --git a/source/build/src/glsurface.cpp b/source/build/src/glsurface.cpp
index b1c8ab0cd..f6d19694c 100644
--- a/source/build/src/glsurface.cpp
+++ b/source/build/src/glsurface.cpp
@@ -13,10 +13,10 @@
#include "../../glbackend/glbackend.h"
static void* buffer;
-static GLuint bufferTexID;
+static FHardwareTexture* bufferTexture;
static vec2_t bufferRes;
-static GLuint paletteTexID;
+static FHardwareTexture* paletteTexture;
static GLuint shaderProgramID = 0;
static GLint texSamplerLoc = -1;
@@ -64,18 +64,10 @@ bool glsurface_initialize(vec2_t bufferResolution)
bufferRes = bufferResolution;
buffer = Xaligned_alloc(16, bufferRes.x * bufferRes.y);
- glActiveTexture(GL_TEXTURE0);
- GetTextureHandle(&bufferTexID);
- glBindTexture(GL_TEXTURE_2D, bufferTexID);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, bufferRes.x, bufferRes.y, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
+ bufferTexture = GLInterface.NewTexture();
+ bufferTexture->CreateTexture(bufferRes.x, bufferRes.y, true, false);
+ GLInterface.Init();
glsurface_setPalette(curpalettefaded);
const char* const VERTEX_SHADER_CODE =
@@ -147,10 +139,10 @@ void glsurface_destroy()
ALIGNED_FREE_AND_NULL(buffer);
- glDeleteTextures(1, &bufferTexID);
- bufferTexID = 0;
- glDeleteTextures(1, &paletteTexID);
- paletteTexID = 0;
+ delete bufferTexture;
+ bufferTexture = nullptr;
+ delete paletteTexture;
+ paletteTexture = nullptr;
glUseProgram(0);
glDeleteProgram(shaderProgramID);
@@ -164,25 +156,13 @@ void glsurface_setPalette(void* pPalette)
if (!pPalette)
return;
- glActiveTexture(GL_TEXTURE1);
- if (paletteTexID)
- {
- // assume the texture is already bound to GL_TEXTURE1
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*) pPalette);
- }
- else
- {
- GetTextureHandle(&paletteTexID);
- glBindTexture(GL_TEXTURE_2D, paletteTexID);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pPalette);
- }
+ if (!paletteTexture)
+ {
+ paletteTexture = GLInterface.NewTexture();
+ paletteTexture->CreateTexture(256, 1, false, false);
+ }
+ paletteTexture->LoadTexture(palette);
+ GLInterface.BindTexture(1, paletteTexture, Sampler2DNoFilter);
}
void* glsurface_getBuffer()
@@ -200,8 +180,8 @@ void glsurface_blitBuffer()
if (!buffer)
return;
- glActiveTexture(GL_TEXTURE0);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bufferRes.x, bufferRes.y, GL_RED, GL_UNSIGNED_BYTE, (void*) buffer);
+ bufferTexture->LoadTexture((uint8_t*)buffer);
+ GLInterface.BindTexture(0, bufferTexture, Sampler2DNoFilter);
auto data = GLInterface.AllocVertices(4);
auto vt = data.second;
diff --git a/source/build/src/mdsprite.cpp b/source/build/src/mdsprite.cpp
index 07dc0fe08..971ea5495 100644
--- a/source/build/src/mdsprite.cpp
+++ b/source/build/src/mdsprite.cpp
@@ -126,7 +126,7 @@ void freeallmodels()
// Skin texture names can be aliased! This is ugly, but at least correct.
-static void nullskintexids(GLuint texid)
+static void nullskintexids(FHardwareTexture *texid)
{
int32_t i, j;
@@ -141,12 +141,12 @@ static void nullskintexids(GLuint texid)
for (j=0; j < m2->numskins * HICTINT_MEMORY_COMBINATIONS; j++)
if (m2->texid[j] == texid)
- m2->texid[j] = 0;
+ m2->texid[j] = nullptr;
for (sk=m2->skinmap; sk; sk=sk->next)
for (j=0; j < HICTINT_MEMORY_COMBINATIONS; j++)
if (sk->texid[j] == texid)
- sk->texid[j] = 0;
+ sk->texid[j] = nullptr;
}
}
}
@@ -166,8 +166,8 @@ void clearskins(int32_t type)
for (j=0; jtexid[j])
{
- glDeleteTextures(1, &v->texid[j]);
- v->texid[j] = 0;
+ delete v->texid[j];
+ v->texid[j] = nullptr;
}
}
else if ((m->mdnum == 2 || m->mdnum == 3) && type == INVALIDATE_ALL)
@@ -178,10 +178,10 @@ void clearskins(int32_t type)
for (j=0; j < m2->numskins * HICTINT_MEMORY_COMBINATIONS; j++)
if (m2->texid[j])
{
- GLuint otexid = m2->texid[j];
+ auto otexid = m2->texid[j];
- glDeleteTextures(1, &m2->texid[j]);
- m2->texid[j] = 0;
+ delete m2->texid[j];
+ m2->texid[j] = nullptr;
nullskintexids(otexid);
}
@@ -190,10 +190,10 @@ void clearskins(int32_t type)
for (j=0; j < HICTINT_MEMORY_COMBINATIONS; j++)
if (sk->texid[j])
{
- GLuint otexid = sk->texid[j];
+ auto otexid = sk->texid[j];
- glDeleteTextures(1, &sk->texid[j]);
- sk->texid[j] = 0;
+ delete sk->texid[j];
+ sk->texid[j] = nullptr;
nullskintexids(otexid);
}
@@ -208,8 +208,8 @@ void clearskins(int32_t type)
for (j=0; jtexid[j])
{
- glDeleteTextures(1, &v->texid[j]);
- v->texid[j] = 0;
+ delete v->texid[j];
+ v->texid[j] = nullptr;
}
}
}
@@ -559,28 +559,28 @@ static inline int32_t hicfxid(size_t pal)
return globalnoeffect ? 0 : ((hictinting[pal].f & (HICTINT_GRAYSCALE|HICTINT_INVERT|HICTINT_COLORIZE)) | ((hictinting[pal].f & HICTINT_BLENDMASK)<<3));
}
-static int32_t mdloadskin_notfound(char * const skinfile, char const * const fn)
+static FHardwareTexture *mdloadskin_notfound(char * const skinfile, char const * const fn)
{
OSD_Printf("Skin \"%s\" not found.\n", fn);
skinfile[0] = 0;
- return 0;
+ return nullptr;
}
-static int32_t mdloadskin_failed(char * const skinfile, char const * const fn)
+static FHardwareTexture *mdloadskin_failed(char * const skinfile, char const * const fn)
{
OSD_Printf("Failed loading skin file \"%s\".\n", fn);
skinfile[0] = 0;
- return 0;
+ return nullptr;
}
//Note: even though it says md2model, it works for both md2model&md3model
-int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
+FHardwareTexture *mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
{
int32_t i;
char *skinfile = NULL, fn[BMAX_PATH];
- GLuint *texidx = NULL;
+ FHardwareTexture **texidx = NULL;
mdskinmap_t *sk, *skzero = NULL;
int32_t doalloc = 1;
@@ -624,21 +624,6 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
}
else
return 0;
-#if 0
- {
- // fall back to the model-defined texture
- if ((unsigned)number >= (unsigned)m->numskins)
- number = 0;
-
- // m->skinfn is undefined when md3model_t is cast to md2model_t --> crash
- skinfile = m->skinfn + number*64;
- texidx = &m->texid[number * HICTINT_MEMORY_COMBINATIONS + hicfxid(pal)];
- Bstrncpyz(fn, m->basepath, BMAX_PATH);
- if ((Bstrlen(fn) + Bstrlen(skinfile)) < BMAX_PATH)
- Bstrcat(fn,skinfile);
- //OSD_Printf("Using MD2/MD3 skin (%d) %s, pal=%d\n",number,skinfile,pal);
- }
-#endif
}
if (skinfile == NULL || !skinfile[0])
@@ -857,16 +842,16 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
if (pal < (MAXPALOOKUPS - RESERVEDPALS))
m->usesalpha = hasalpha;
- if ((doalloc&3)==1)
- GetTextureHandle(texidx);
-
- glBindTexture(GL_TEXTURE_2D, *texidx);
+ if ((doalloc & 3) == 1)
+ {
+ *texidx = GLInterface.NewTexture();
+ }
//gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,xsiz,ysiz,GL_BGRA_EXT,GL_UNSIGNED_BYTE,(char *)fptr);
int32_t const texfmt = glinfo.bgra ? GL_BGRA : GL_RGBA;
- uploadtexture((doalloc&1), siz, texfmt, pic, tsiz,
+ uploadtexture(*texidx, (doalloc&1), siz, texfmt, pic, tsiz,
DAMETH_HI | DAMETH_MASK |
TO_DAMETH_NODOWNSIZE(sk->flags) |
TO_DAMETH_NOTEXCOMPRESS(sk->flags) |
@@ -913,17 +898,10 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
m->skinloaded = 1+number;
}
- int32_t const filter = (sk->flags & HICR_FORCEFILTER) ? TEXFILTER_ON : gltexfiltermode;
-
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,glfiltermodes[filter].mag);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,glfiltermodes[filter].min);
-#ifdef USE_GLEXT
- if (glinfo.maxanisotropy > 1.0)
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_ANISOTROPY_EXT,glanisotropy);
-#endif
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
-
+ if (*texidx)
+ {
+ (*texidx)->SetSampler(SamplerRepeat);
+ }
if (willprint)
{
int32_t etime = timerGetTicks()-startticks;
@@ -1215,7 +1193,7 @@ static md2model_t *md2load(buildvfs_kfd fil, const char *filnam)
{ Bfree(m->glcmds); Bfree(m->frames); Bfree(m); return 0; }
}
- m->texid = (GLuint *)Xcalloc(ournumskins, sizeof(GLuint) * HICTINT_MEMORY_COMBINATIONS);
+ m->texid = (FHardwareTexture **)Xcalloc(ournumskins, sizeof(FHardwareTexture*) * HICTINT_MEMORY_COMBINATIONS);
maxmodelverts = max(maxmodelverts, m->numverts);
maxmodeltris = max(maxmodeltris, head.numtris);
@@ -1225,7 +1203,7 @@ static md2model_t *md2load(buildvfs_kfd fil, const char *filnam)
// the MD2 is now loaded internally - let's begin the MD3 conversion process
//OSD_Printf("Beginning md3 conversion.\n");
m3 = (md3model_t *)Xcalloc(1, sizeof(md3model_t));
- m3->mdnum = 3; m3->texid = 0; m3->scale = m->scale;
+ m3->mdnum = 3; m3->texid = nullptr; m3->scale = m->scale;
m3->head.id = IDP3_MAGIC; m3->head.vers = 15;
m3->head.flags = 0;
@@ -2041,8 +2019,6 @@ static int32_t polymost_md3draw(md3model_t *m, const uspritetype *tspr)
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
- glEnable(GL_TEXTURE_2D);
-
// tinting
pc[0] = pc[1] = pc[2] = ((float)numshades - min(max((globalshade * shadescale) + m->shadeoff, 0.f), (float)numshades)) / (float)numshades;
polytintflags_t const tintflags = hictinting[globalpal].f;
@@ -2164,11 +2140,11 @@ static int32_t polymost_md3draw(md3model_t *m, const uspritetype *tspr)
mat[3] = mat[7] = mat[11] = 0.f; mat[15] = 1.f; glLoadMatrixf(mat);
// PLAG: End
- i = mdloadskin((md2model_t *)m,tile2model[Ptile2tile(tspr->picnum,lpal)].skinnum,globalpal,surfi);
- if (!i)
+ auto tex = mdloadskin((md2model_t *)m,tile2model[Ptile2tile(tspr->picnum,lpal)].skinnum,globalpal,surfi);
+ if (!tex)
continue;
//i = mdloadskin((md2model *)m,tile2model[Ptile2tile(tspr->picnum,lpal)].skinnum,surfi); //hack for testing multiple surfaces per MD3
- glBindTexture(GL_TEXTURE_2D, i);
+ GLInterface.BindTexture(0, tex);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
@@ -2181,38 +2157,42 @@ static int32_t polymost_md3draw(md3model_t *m, const uspritetype *tspr)
//POGOTODO: if we add support for palette indexing on model skins, the texture for the palswap could be setup here
texunits += 4;
- i = r_detailmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, DETAILPAL, surfi) : 0;
+ tex = r_detailmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, DETAILPAL, surfi) : nullptr;
- if (i)
+ if (tex)
{
mdskinmap_t *sk;
polymost_useDetailMapping(true);
- polymost_setupdetailtexture(GL_TEXTURE3, i);
+ polymost_setupdetailtexture(3, tex);
for (sk = m->skinmap; sk; sk = sk->next)
if ((int32_t) sk->palette == DETAILPAL && sk->skinnum == tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum && sk->surfnum == surfi)
f = sk->param;
+ glActiveTexture(GL_TEXTURE3);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(xpanning, ypanning, 1.0f);
glScalef(f, f, 1.0f);
glMatrixMode(GL_MODELVIEW);
- }
+ glActiveTexture(GL_TEXTURE0);
+ }
- i = r_glowmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, GLOWPAL, surfi) : 0;
+ tex = r_glowmapping ? mdloadskin((md2model_t *) m, tile2model[Ptile2tile(tspr->picnum, lpal)].skinnum, GLOWPAL, surfi) : 0;
if (i)
{
polymost_useGlowMapping(true);
- polymost_setupglowtexture(GL_TEXTURE4, i);
+ polymost_setupglowtexture(4, tex);
- glMatrixMode(GL_TEXTURE);
+ glActiveTexture(GL_TEXTURE4);
+ glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glTranslatef(xpanning, ypanning, 1.0f);
glMatrixMode(GL_MODELVIEW);
- }
+ glActiveTexture(GL_TEXTURE0);
+ }
#endif
indexhandle = m->vindexes;
@@ -2267,17 +2247,6 @@ static int32_t polymost_md3draw(md3model_t *m, const uspritetype *tspr)
}
#ifdef USE_GLEXT
- {
- while (texunits > GL_TEXTURE0)
- {
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
- glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 1.0f);
- glDisable(GL_TEXTURE_2D);
- }
- } // r_vertexarrays
-
polymost_useDetailMapping(false);
polymost_useGlowMapping(false);
#endif
diff --git a/source/build/src/palette.cpp b/source/build/src/palette.cpp
index d9eafa3de..7ce49dcb7 100644
--- a/source/build/src/palette.cpp
+++ b/source/build/src/palette.cpp
@@ -59,7 +59,6 @@ void fullscreen_tint_gl(uint8_t r, uint8_t g, uint8_t b, uint8_t f)
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
- glDisable(GL_TEXTURE_2D);
polymost_setFogEnabled(false);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp
index 974953abc..a71e4d339 100644
--- a/source/build/src/polymost.cpp
+++ b/source/build/src/polymost.cpp
@@ -24,7 +24,6 @@ Ken Silverman's official web site: http://www.advsys.net/ken
#include "texcache.h"
#include "common.h"
#include "palette.h"
-#include "tilepacker.h"
#include "../../glbackend/glbackend.h"
#include "vfs.h"
@@ -107,7 +106,7 @@ int32_t r_glowmapping = 1;
int32_t gltexmaxsize = 0; // 0 means autodetection on first run
int32_t gltexmiplevel = 0; // discards this many mipmap levels
int32_t glprojectionhacks = 1;
-static GLuint polymosttext = 0;
+static FHardwareTexture *polymosttext = 0;
int32_t glrendmode = REND_POLYMOST;
// This variable, and 'shadeforfullbrightpass' control the drawing of
@@ -145,12 +144,11 @@ static GLint fogColorLoc = -1;
#define PALSWAP_TEXTURE_SIZE 2048
int32_t r_useindexedcolortextures = -1;
-static GLuint tilesheetTexIDs[MAXTILESHEETS];
static GLint tilesheetSize = 0;
static vec2f_t tilesheetHalfTexelSize = { 0.f, 0.f };
static int32_t lastbasepal = -1;
-static GLuint paletteTextureIDs[MAXBASEPALS];
-static GLuint palswapTextureID = 0;
+static FHardwareTexture *paletteTextureIDs[MAXBASEPALS];
+static FHardwareTexture *palswapTextureID = nullptr;
static GLuint polymost1CurrentShaderProgramID = 0;
static GLuint polymost1BasicShaderProgramID = 0;
static GLuint polymost1ExtendedShaderProgramID = 0;
@@ -217,22 +215,8 @@ int32_t r_parallaxskypanning = 1;
#define MIN_CACHETIME_PRINT 10
-void GetTextureHandle(GLuint *handle)
-{
- *handle = GLInterface.GetTextureID();
-}
-
-
-// this was faster in MSVC but slower with GCC... currently unknown on ARM where both
-// the FPU and possibly the optimization path in the compiler need improvement
-#if 0
-static inline int32_t __float_as_int(float f) { return *(int32_t *) &f; }
-static inline float __int_as_float(int32_t d) { return *(float *) &d; }
-static inline float Bfabsf(float f) { return __int_as_float(__float_as_int(f)&0x7fffffff); }
-#else
#define Bfabsf fabsf
-#endif
int32_t mdtims, omdtims;
uint8_t alphahackarray[MAXTILES];
@@ -241,20 +225,6 @@ int32_t hicprecaching = 0;
hitdata_t polymost_hitdata;
-#if 0
-static inline int32_t gltexmayhavealpha(int32_t dapicnum, int32_t dapalnum)
-{
- const int32_t j = (dapicnum&(GLTEXCACHEADSIZ-1));
- pthtyp *pth;
-
- for (pth=texcache.list[j]; pth; pth=pth->next)
- if (pth->picnum == dapicnum && pth->palnum == dapalnum)
- return ((pth->flags&PTH_HASALPHA) != 0);
-
- return 1;
-}
-#endif
-
void gltexinvalidate(int32_t dapicnum, int32_t dapalnum, int32_t dameth)
{
const int32_t pic = (dapicnum&(GLTEXCACHEADSIZ-1));
@@ -297,77 +267,22 @@ void gltexinvalidatetype(int32_t type)
#endif
}
-static void bind_2d_texture(GLuint texture, int filter)
-{
- if (filter == -1)
- filter = gltexfiltermode;
-
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, glfiltermodes[filter].mag);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glfiltermodes[filter].min);
-#ifdef USE_GLEXT
- if (glinfo.maxanisotropy > 1.f)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, glanisotropy);
-#endif
-}
-
void gltexapplyprops(void)
{
if (videoGetRenderMode() == REND_CLASSIC)
return;
- GLInterface.mSamplers->SetTextureFilterMode(gltexfiltermode, glanisotropy);
+ if (glinfo.maxanisotropy > 1.f)
+ {
+ if (glanisotropy <= 0 || glanisotropy > glinfo.maxanisotropy)
+ glanisotropy = (int32_t)glinfo.maxanisotropy;
+ }
- if (glinfo.maxanisotropy > 1.f)
- {
- if (glanisotropy <= 0 || glanisotropy > glinfo.maxanisotropy)
- glanisotropy = (int32_t)glinfo.maxanisotropy;
- }
+
+ GLInterface.mSamplers->SetTextureFilterMode(gltexfiltermode, glanisotropy);
gltexfiltermode = clamp(gltexfiltermode, 0, NUMGLFILTERMODES-1);
r_useindexedcolortextures = !gltexfiltermode;
-
- for (bssize_t i=0; i<=GLTEXCACHEADSIZ-1; i++)
- {
- for (pthtyp *pth=texcache.list[i]; pth; pth=pth->next)
- {
- if (pth->flags & PTH_INDEXED)
- {
- //POGO: indexed textures should not be filtered
- continue;
- }
-
- int32_t const filter = (pth->flags & PTH_FORCEFILTER) ? TEXFILTER_ON : -1;
-
- bind_2d_texture(pth->glpic, filter);
-
- if (r_fullbrights && pth->flags & PTH_HASFULLBRIGHT)
- bind_2d_texture(pth->ofb->glpic, filter);
- }
- }
-
- for (bssize_t i=0; imdnum < 2)
- continue;
-
- for (bssize_t j = 0; j < m->numskins * HICTINT_MEMORY_COMBINATIONS; j++)
- {
- if (!m->texid[j])
- continue;
- bind_2d_texture(m->texid[j], -1);
- }
-
- for (mdskinmap_t *sk = m->skinmap; sk; sk = sk->next)
- for (bssize_t j = 0; j < HICTINT_MEMORY_COMBINATIONS; j++)
- {
- if (!sk->texid[j])
- continue;
- bind_2d_texture(sk->texid[j], (sk->flags & HICR_FORCEFILTER) ? TEXFILTER_ON : -1);
- }
- }
}
//--------------------------------------------------------------------------------------------------
@@ -501,11 +416,11 @@ void polymost_glreset()
if (pth->flags & PTH_HASFULLBRIGHT)
{
- glDeleteTextures(1, &pth->ofb->glpic);
+ delete pth->ofb->glpic;
Bfree(pth->ofb);
}
- glDeleteTextures(1, &pth->glpic);
+ delete pth->glpic;
Bfree(pth);
pth = next;
}
@@ -516,9 +431,9 @@ void polymost_glreset()
clearskins(INVALIDATE_ALL);
}
- if (polymosttext)
- glDeleteTextures(1,&polymosttext);
- polymosttext=0;
+ if (polymosttext)
+ delete polymosttext;
+ polymosttext=nullptr;
Bmemset(texcache.list,0,sizeof(texcache.list));
glox1 = -1;
@@ -557,11 +472,8 @@ void polymost_resetProgram()
useShaderProgram(polymost1CurrentShaderProgramID);
// ensure that palswapTexture and paletteTexture[curbasepal] is bound
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, palswapTextureID);
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D, paletteTextureIDs[curbasepal]);
- glActiveTexture(GL_TEXTURE0);
+ GLInterface.BindTexture(1, palswapTextureID);
+ GLInterface.BindTexture(2, paletteTextureIDs[curbasepal]);
}
static void polymost_setCurrentShaderProgram(uint32_t programID)
@@ -759,50 +671,15 @@ void polymost_npotEmulation(char npotEmulation, float factor, float xOffset)
glUniform1f(polymost1NPOTEmulationXOffsetLoc, polymost1NPOTEmulationXOffset);
}
-void polymost_activeTexture(GLenum texture)
-{
- currentActiveTexture = texture;
- glad_glActiveTexture(texture);
-}
-
-//POGOTODO: replace this and polymost_activeTexture with proper draw call organization
-void polymost_bindTexture(GLenum target, uint32_t textureID)
-{
- glBindSampler(currentActiveTexture - GL_TEXTURE0, 0);
- glad_glBindTexture(target, textureID);
- if (currentActiveTexture == GL_TEXTURE0)
- {
- currentTextureID = textureID;
- }
-}
-
-static void polymost_bindPth(pthtyp const * const pPth)
+static void polymost_bindPth(pthtyp const * const pPth, int sampler)
{
Bassert(pPth);
vec4f_t texturePosSize = { 0.f, 0.f, 1.f, 1.f };
vec2f_t halfTexelSize = { 0.f, 0.f };
- if ((pPth->flags & PTH_INDEXED) &&
- !(pPth->flags & PTH_HIGHTILE))
- {
- Tile tile;
- char tileIsPacked = tilepacker_getTile(waloff[pPth->picnum] ? pPth->picnum+1 : 0, &tile);
- //POGO: check the width and height to ensure that the tile hasn't been changed for a user tile that has different dimensions
- if (tileIsPacked &&
- (!waloff[pPth->picnum] ||
- (tile.rect.width == (uint32_t) tilesiz[pPth->picnum].y &&
- tile.rect.height == (uint32_t) tilesiz[pPth->picnum].x)))
- {
- texturePosSize = { tile.rect.u/(float) tilesheetSize,
- tile.rect.v/(float) tilesheetSize,
- tile.rect.width/(float) tilesheetSize,
- tile.rect.height/(float) tilesheetSize };
- halfTexelSize = tilesheetHalfTexelSize;
- }
- }
polymost_setTexturePosSize(texturePosSize);
polymost_setHalfTexelSize(halfTexelSize);
- glBindTexture(GL_TEXTURE_2D, pPth->glpic);
+ GLInterface.BindTexture(0, pPth->glpic, sampler);
}
void useShaderProgram(uint32_t shaderID)
@@ -814,6 +691,7 @@ void useShaderProgram(uint32_t shaderID)
// one-time initialization of OpenGL for polymost
void polymost_glinit()
{
+ glEnable(GL_TEXTURE_2D);
glHint(GL_FOG_HINT, GL_NICEST);
glFogi(GL_FOG_MODE, (r_usenewshading < 2) ? GL_EXP2 : GL_LINEAR);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -844,37 +722,6 @@ void polymost_glinit()
tilesheetHalfTexelSize = { 0.5f/tilesheetSize, 0.5f/tilesheetSize };
vec2_t maxTexDimensions = { tilesheetSize, tilesheetSize };
char allPacked = false;
- static uint32_t numTilesheets = 0;
- //POGO: only pack the tilesheets once
- if (numTilesheets == 0)
- {
- // add a blank texture for tileUID 0
- tilepacker_addTile(0, 2, 2);
- for (int picnum = 0; picnum < MAXTILES; ++picnum)
- {
- tilepacker_addTile(picnum+1, (uint32_t) tilesiz[picnum].y, (uint32_t) tilesiz[picnum].x);
- }
-
- do
- {
- tilepacker_initTilesheet(numTilesheets, tilesheetSize, tilesheetSize);
- allPacked = tilepacker_pack(numTilesheets);
- ++numTilesheets;
- } while (!allPacked && numTilesheets < MAXTILESHEETS);
- }
- for (uint32_t i = 0; i < numTilesheets; ++i)
- {
- GetTextureHandle(tilesheetTexIDs+i);
- glBindTexture(GL_TEXTURE_2D, tilesheetTexIDs[i]);
- uploadtextureindexed(true, {0, 0}, maxTexDimensions, (intptr_t) NULL);
- }
-
- const char blankTex[] = {255, 255,
- 255, 255};
- Tile blankTile;
- tilepacker_getTile(0, &blankTile);
- glBindTexture(GL_TEXTURE_2D, tilesheetTexIDs[blankTile.tilesheetID]);
- uploadtextureindexed(false, {(int32_t) blankTile.rect.u, (int32_t) blankTile.rect.v}, {2, 2}, (intptr_t) blankTex);
const char* const POLYMOST2_BASIC_VERTEX_SHADER_CODE =
"#version 110\n\
@@ -1448,7 +1295,6 @@ static void resizeglcheck(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glDisable(GL_TEXTURE_2D);
}
#else
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
@@ -1484,8 +1330,6 @@ static void resizeglcheck(void)
glLoadIdentity();
if (!nofog) polymost_setFogEnabled(true);
-
- //glEnable(GL_TEXTURE_2D);
}
}
@@ -1535,44 +1379,17 @@ static void fixtransparency(coltype *dapic, vec2_t dasiz, vec2_t dasiz2, int32_t
}
-static void Polymost_SendTexToDriver(int32_t const doalloc,
- vec2_t const siz,
- int32_t const texfmt,
- coltype const * const pic,
- int32_t const intexfmt,
-#if defined EDUKE32_GLES
- int32_t const comprtexfmt,
- int32_t const texcompress_ok,
-#endif
- int32_t const level)
-{
-
-#if B_BIG_ENDIAN
- GLenum type = GL_UNSIGNED_INT_8_8_8_8;
-#else
- GLenum type = GL_UNSIGNED_INT_8_8_8_8_REV;
-#endif
- if (doalloc & 1)
- glTexImage2D(GL_TEXTURE_2D, level, intexfmt, siz.x,siz.y, 0, texfmt, type, pic);
- else
- glTexSubImage2D(GL_TEXTURE_2D, level, 0,0, siz.x,siz.y, texfmt, type, pic);
- glGenerateMipmap(GL_TEXTURE_2D);
-}
-
-
-void uploadtexture(int32_t doalloc, vec2_t siz, int32_t texfmt,
+void uploadtexture(FHardwareTexture *tex, int32_t doalloc, vec2_t siz, int32_t texfmt,
coltype* pic, vec2_t tsiz, int32_t dameth)
{
- int32_t intexfmt = GL_RGBA8;
#ifdef TIMING
cycle_t clock;
clock.Reset();
clock.Clock();
#endif
- Polymost_SendTexToDriver(doalloc, siz, texfmt, pic,
- intexfmt,
- 0);
+
+ tex->LoadTexture((uint8_t *)pic);
#ifdef TIMING
clock.Unclock();
@@ -1580,26 +1397,6 @@ void uploadtexture(int32_t doalloc, vec2_t siz, int32_t texfmt,
static int ttt;
OSD_Printf("%d: texture upload %d x %d took %2.3f ms\n", ttt++, siz.x, siz.y, clock.TimeMS());
#endif
-
- return;
-}
-
-void uploadtextureindexed(int32_t doalloc, vec2_t offset, vec2_t siz, intptr_t tile)
-{
- if (doalloc & 1)
- {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, siz.y, siz.x, 0, GL_RED, GL_UNSIGNED_BYTE, (void*) tile);
- }
- else
- {
- glTexSubImage2D(GL_TEXTURE_2D, 0, offset.x, offset.y, siz.y, siz.x, GL_RED, GL_UNSIGNED_BYTE, (void*) tile);
- }
}
void uploadbasepalette(int32_t basepalnum)
@@ -1624,27 +1421,14 @@ void uploadbasepalette(int32_t basepalnum)
basepalWFullBrightInfo[i*4+3] = 0-(IsPaletteIndexFullbright(i) != 0);
}
- char allocateTexture = !paletteTextureIDs[basepalnum];
- if (allocateTexture)
- {
- GetTextureHandle(&paletteTextureIDs[basepalnum]);
- }
- glBindTexture(GL_TEXTURE_2D, paletteTextureIDs[basepalnum]);
- if (allocateTexture)
- {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, basepalWFullBrightInfo);
- }
- else
- {
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, basepalWFullBrightInfo);
+ if (!paletteTextureIDs[basepalnum])
+ {
+ auto &p = paletteTextureIDs[basepalnum];
+ p = GLInterface.NewTexture();
+ p->CreateTexture(256, 1, false, false);
+ p->SetSampler(Sampler2DNoFilter);
}
+ paletteTextureIDs[basepalnum]->LoadTexture(basepalWFullBrightInfo); // RGBA
}
void uploadpalswap(int32_t palookupnum)
@@ -1659,22 +1443,24 @@ void uploadpalswap(int32_t palookupnum)
return;
}
+ // No point porting this, it's too much work for a short lived solution.
+#if 0
char allocateTexture = !palswapTextureID;
if (allocateTexture)
{
- GetTextureHandle(&palswapTextureID);
+ G etTextureHandle(&palswapTextureID);
}
- glBindTexture(GL_TEXTURE_2D, palswapTextureID);
+ g lBindTexture(GL_TEXTURE_2D, palswapTextureID);
if (allocateTexture)
{
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, PALSWAP_TEXTURE_SIZE, PALSWAP_TEXTURE_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ g lTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ g lTexImage2D(GL_TEXTURE_2D, 0, GL_RED, PALSWAP_TEXTURE_SIZE, PALSWAP_TEXTURE_SIZE, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
}
int32_t column = palookupnum%(PALSWAP_TEXTURE_SIZE/256);
@@ -1685,55 +1471,22 @@ void uploadpalswap(int32_t palookupnum)
OSD_Printf("Polymost: palswaps are too large for palswap tilesheet!\n");
return;
}
- glTexSubImage2D(GL_TEXTURE_2D, 0, 256*column, rowOffset, 256, numshades+1, GL_RED, GL_UNSIGNED_BYTE, palookup[palookupnum]);
+ g lTexSubImage2D(GL_TEXTURE_2D, 0, 256*column, rowOffset, 256, numshades+1, GL_RED, GL_UNSIGNED_BYTE, palookup[palookupnum]);
+#endif
}
-#if 0
-// TODO: make configurable
-static int32_t tile_is_sky(int32_t tilenum)
+static void polymost_setuptexture(FHardwareTexture *tex, const int32_t dameth, int filter)
{
- return return (tilenum >= 78 /*CLOUDYOCEAN*/ && tilenum <= 99 /*REDSKY2*/);
-}
-# define clamp_if_tile_is_sky(x, y) (tile_is_sky(x) ? (y) : GL_REPEAT)
-#else
-# define clamp_if_tile_is_sky(x, y) (GL_REPEAT)
-#endif
-
-static void polymost_setuptexture(const int32_t dameth, int filter)
-{
- const GLuint clamp_mode = glinfo.clamptoedge ? GL_CLAMP_TO_EDGE : GL_CLAMP;
-
- gltexfiltermode = clamp(gltexfiltermode, 0, NUMGLFILTERMODES-1);
-
- if (filter == -1)
- filter = gltexfiltermode;
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, glfiltermodes[filter].mag);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, glfiltermodes[filter].min);
-
-#ifdef USE_GLEXT
- if (glinfo.maxanisotropy > 1.f)
- {
- uint32_t i = (unsigned)Blrintf(glinfo.maxanisotropy);
-
- if ((unsigned)glanisotropy > i)
- glanisotropy = i;
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, glanisotropy);
- }
-#endif
if (!(dameth & DAMETH_CLAMPED))
{
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp_if_tile_is_sky(dapic, clamp_mode));
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ tex->SetSampler(SamplerRepeat);
}
else
{
// For sprite textures, clamping looks better than wrapping
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp_mode);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp_mode);
+ tex->SetSampler(SamplerClampXY);
}
}
@@ -1747,44 +1500,21 @@ static void gloadtile_art_indexed(int32_t dapic, int32_t dameth, pthtyp *pth, in
//POGOTODO: if !glinfo.texnpot, then we could allocate a texture of the pow2 size, and then populate the subportion using buffersubdata func
//if (!glinfo.texnpot)
- Tile tile = {};
if (waloff[dapic])
{
- char tileIsPacked = tilepacker_getTile(dapic+1, &tile);
- if (tileIsPacked &&
- tile.rect.width == (uint32_t) tsizart.y &&
- tile.rect.height == (uint32_t) tsizart.x)
- {
- pth->glpic = tilesheetTexIDs[tile.tilesheetID];
- doalloc = false;
- }
- else if (doalloc)
- {
- GetTextureHandle((GLuint *)&pth->glpic);
- }
- glBindTexture(GL_TEXTURE_2D, pth->glpic);
-
if (doalloc)
{
- const GLuint clamp_mode = glinfo.clamptoedge ? GL_CLAMP_TO_EDGE : GL_CLAMP;
- if (!(dameth & DAMETH_CLAMPED))
- {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp_if_tile_is_sky(dapic, clamp_mode));
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- }
- else
- {
- // For sprite textures, clamping looks better than wrapping
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp_mode);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp_mode);
- }
+ assert(pth->glpic == nullptr);
+ pth->glpic = GLInterface.NewTexture();
+ pth->glpic->CreateTexture(siz.x, siz.y, true, false);
+ pth->glpic->SetSampler(SamplerNoFilter);
+ polymost_setuptexture(pth->glpic, dameth, 0);
}
- uploadtextureindexed(doalloc, {(int32_t) tile.rect.u, (int32_t) tile.rect.v}, siz, waloff[dapic]);
+ pth->glpic->LoadTexture((uint8_t*)waloff[dapic]); // Indexed
}
else
{
- tilepacker_getTile(0, &tile);
- pth->glpic = tilesheetTexIDs[tile.tilesheetID];
+ assert(false);
}
pth->picnum = dapic;
@@ -1940,8 +1670,11 @@ void gloadtile_art(int32_t dapic, int32_t dapal, int32_t tintpalnum, int32_t das
}
}
- if (doalloc) GetTextureHandle((GLuint *)&pth->glpic); //# of textures (make OpenGL allocate structure)
- glBindTexture(GL_TEXTURE_2D, pth->glpic);
+ if (doalloc)
+ {
+ pth->glpic = GLInterface.NewTexture();
+ pth->glpic->CreateTexture(siz.x, siz.y, false, true);
+ }
fixtransparency(pic,tsiz,siz,dameth);
@@ -1962,7 +1695,7 @@ void gloadtile_art(int32_t dapic, int32_t dapal, int32_t tintpalnum, int32_t das
npoty = 1;
}
- uploadtexture(doalloc, siz, GL_BGRA, pic, tsiz,
+ uploadtexture(pth->glpic, doalloc, siz, GL_BGRA, pic, tsiz,
dameth | DAMETH_ARTIMMUNITY |
(dapic >= MAXUSERTILES ? (DAMETH_NOTEXCOMPRESS|DAMETH_NODOWNSIZE) : 0) | /* never process these short-lived tiles */
(hasfullbright ? DAMETH_HASFULLBRIGHT : 0) |
@@ -1972,7 +1705,7 @@ void gloadtile_art(int32_t dapic, int32_t dapal, int32_t tintpalnum, int32_t das
Bfree(pic);
}
- polymost_setuptexture(dameth, -1);
+ polymost_setuptexture(pth->glpic, dameth, -1);
pth->picnum = dapic;
pth->palnum = dapal;
@@ -2227,15 +1960,17 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
if (tsiz.x>>r_downsize <= tilesiz[dapic].x || tsiz.y>>r_downsize <= tilesiz[dapic].y)
hicr->flags |= HICR_ARTIMMUNITY;
- if ((doalloc&3)==1)
- GetTextureHandle(&pth->glpic); //# of textures (make OpenGL allocate structure)
- glBindTexture(GL_TEXTURE_2D, pth->glpic);
+ if ((doalloc & 3) == 1)
+ {
+ pth->glpic = GLInterface.NewTexture();
+ pth->glpic->CreateTexture(siz.x, siz.y, false, true);
+ }
fixtransparency(pic,tsiz,siz,dameth);
int32_t const texfmt = glinfo.bgra ? GL_BGRA : GL_RGBA;
- uploadtexture(doalloc,siz,texfmt,pic,tsiz,
+ uploadtexture(pth->glpic, doalloc,siz,texfmt,pic,tsiz,
dameth | DAMETH_HI | DAMETH_NOFIX |
TO_DAMETH_NODOWNSIZE(hicr->flags) |
TO_DAMETH_NOTEXCOMPRESS(hicr->flags) |
@@ -2258,7 +1993,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
pth->scale.y = (float)tsiz.y / (float)tilesiz[dapic].y;
}
- polymost_setuptexture(dameth, (hicr->flags & HICR_FORCEFILTER) ? TEXFILTER_ON : -1);
+ polymost_setuptexture(pth->glpic, dameth, (hicr->flags & HICR_FORCEFILTER) ? TEXFILTER_ON : -1);
if (tsiz.x>>r_downsize <= tilesiz[dapic].x || tsiz.y>>r_downsize <= tilesiz[dapic].y)
hicr->flags |= HICR_ARTIMMUNITY;
@@ -2285,26 +2020,14 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
}
#ifdef USE_GLEXT
-void polymost_setupdetailtexture(const int32_t texunits, const int32_t tex)
+void polymost_setupdetailtexture(const int32_t texunits, FHardwareTexture *tex)
{
- glActiveTexture(texunits);
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, tex);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ GLInterface.BindTexture(texunits, tex, SamplerRepeat);
}
-void polymost_setupglowtexture(const int32_t texunits, const int32_t tex)
+void polymost_setupglowtexture(const int32_t texunits, FHardwareTexture* tex)
{
- glActiveTexture(texunits);
-
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, tex);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ GLInterface.BindTexture(texunits, tex, SamplerRepeat);
}
#endif
@@ -2342,10 +2065,8 @@ static void polymost_updatePalette()
//POGO: only bind the base pal once when it's swapped
if (curbasepal != lastbasepal)
{
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D, paletteTextureIDs[curbasepal]);
+ GLInterface.BindTexture(2, paletteTextureIDs[curbasepal], Sampler2DNoFilter);
lastbasepal = curbasepal;
- glActiveTexture(GL_TEXTURE0);
}
}
@@ -2521,16 +2242,23 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
// just submit the geometry and don't mess with textures.
if (videoGetRenderMode() == REND_POLYMOST)
{
- polymost_bindPth(pth);
//POGOTODO: I could move this into bindPth
if (!(pth->flags & PTH_INDEXED))
polymost_usePaletteIndexing(false);
- if (drawpoly_srepeat)
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- if (drawpoly_trepeat)
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ // The entire logic here is just one lousy hack.
+ int mSampler = NoSampler;
+ if (pth->glpic->GetSampler() != SamplerRepeat)
+ {
+ if (drawpoly_srepeat && drawpoly_trepeat) mSampler = SamplerRepeat;
+ else if (drawpoly_srepeat) mSampler = SamplerClampY;
+ else if (drawpoly_trepeat) mSampler = SamplerClampX;
+ else mSampler = SamplerClampXY;
+ }
+
+ polymost_bindPth(pth, mSampler);
+
}
// texture scale by parkar request
@@ -2561,9 +2289,10 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
detailpth->hicr && detailpth->hicr->palnum == DETAILPAL)
{
polymost_useDetailMapping(true);
- polymost_setupdetailtexture(videoGetRenderMode() == REND_POLYMOST ? GL_TEXTURE3 : ++texunits, detailpth->glpic);
+ polymost_setupdetailtexture(3, detailpth->glpic);
- glMatrixMode(GL_TEXTURE);
+ glActiveTexture(GL_TEXTURE3);
+ glMatrixMode(GL_TEXTURE);
glLoadIdentity();
if (pth->hicr && ((pth->hicr->scale.x != 1.0f) || (pth->hicr->scale.y != 1.0f)))
@@ -2587,8 +2316,7 @@ static void polymost_drawpoly(vec2f_t const * const dpxy, int32_t const n, int32
glowpth->hicr && (glowpth->hicr->palnum == GLOWPAL))
{
polymost_useGlowMapping(true);
- polymost_setupglowtexture(videoGetRenderMode() == REND_POLYMOST ? GL_TEXTURE4 : ++texunits, glowpth->glpic);
- glActiveTexture(GL_TEXTURE0);
+ polymost_setupglowtexture(4, glowpth->glpic);
}
}
@@ -2877,15 +2605,6 @@ do
// restore palette usage if we were just rendering a non-indexed color texture
polymost_usePaletteIndexing(true);
}
-
- int const clamp_mode = glinfo.clamptoedge ? GL_CLAMP_TO_EDGE : GL_CLAMP;
-
- if (drawpoly_srepeat)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clamp_mode);
-
- if (drawpoly_trepeat)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clamp_mode);
-
if (fullbright_pass == 1)
{
int32_t const shade = globalshade;
@@ -5359,7 +5078,6 @@ void polymost_drawrooms()
glClear(GL_DEPTH_BUFFER_BIT);
glDisable(GL_BLEND);
- glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS); //NEVER,LESS,(,L)EQUAL,GREATER,(NOT,G)EQUAL,ALWAYS
// glDepthRange(0.0, 1.0); //<- this is more widely supported than glPolygonOffset
@@ -6775,7 +6493,6 @@ void polymost_dorotatesprite(int32_t sx, int32_t sy, int32_t z, int16_t a, int16
glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST);
- glEnable(GL_TEXTURE_2D);
#if defined(POLYMER)
# ifdef USE_GLEXT
@@ -7152,12 +6869,11 @@ void polymost_fillpolygon(int32_t npoints)
if (gloy1 != -1) polymostSet2dView(); //disables blending, texturing, and depth testing
glEnable(GL_ALPHA_TEST);
- glEnable(GL_TEXTURE_2D);
pthtyp const * const pth = our_texcache_fetch(DAMETH_NOMASK | (videoGetRenderMode() == REND_POLYMOST && r_useindexedcolortextures ? PTH_INDEXED : 0));
if (pth)
{
- polymost_bindPth(pth);
+ polymost_bindPth(pth, -1);
if (!(pth->flags & PTH_INDEXED))
polymost_usePaletteIndexing(false);
@@ -7193,8 +6909,7 @@ static int32_t gen_font_glyph_tex(void)
{
// construct a 256x128 texture for the font glyph matrix
- GetTextureHandle(&polymosttext);
-
+ polymosttext = GLInterface.NewTexture();
if (!polymosttext) return -1;
char * const tbuf = (char *)Xmalloc(256*128*4);
@@ -7237,10 +6952,9 @@ static int32_t gen_font_glyph_tex(void)
}
}
- glBindTexture(GL_TEXTURE_2D, polymosttext);
- glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,256,128,0,GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid *)tbuf);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ polymosttext->CreateTexture(256, 128, false, false);
+ polymosttext->LoadTexture((uint8_t*)tbuf); // RGBA
+ polymosttext->SetSampler(Sampler2DNoFilter);
Bfree(tbuf);
return 0;
@@ -7262,7 +6976,7 @@ int32_t polymost_printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t ba
if (videoGetRenderMode() < REND_POLYMOST || !in3dmode() || (!polymosttext && gen_font_glyph_tex() < 0))
return -1;
- glBindTexture(GL_TEXTURE_2D, polymosttext);
+ GLInterface.BindTexture(0, polymosttext);
polymost_setTexturePosSize({0, 0, 1, 1});
polymost_usePaletteIndexing(false);
@@ -7295,7 +7009,6 @@ int32_t polymost_printext256(int32_t xpos, int32_t ypos, int16_t col, int16_t ba
GLInterface.Draw(DT_TRIANGLE_FAN, data.first, 4);
}
- glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glColor4ub(p.r,p.g,p.b,255);
diff --git a/source/build/src/sdlayer.cpp b/source/build/src/sdlayer.cpp
index 3f3e3b7a7..caf9bb35a 100644
--- a/source/build/src/sdlayer.cpp
+++ b/source/build/src/sdlayer.cpp
@@ -1298,7 +1298,6 @@ void sdlayer_setvideomode_opengl(void)
glsurface_destroy();
polymost_glreset();
- glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH); // GL_FLAT
glClearColor(0, 0, 0, 1.0); // Black Background
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Use FASTEST for ortho!
@@ -1313,34 +1312,6 @@ void sdlayer_setvideomode_opengl(void)
glinfo.version = (const char *) glGetString(GL_VERSION);
glinfo.extensions = (const char *) glGetString(GL_EXTENSIONS);
-#ifdef POLYMER
- if (!Bstrcmp(glinfo.vendor, "ATI Technologies Inc."))
- {
- pr_ati_fboworkaround = 1;
- initprintf("Enabling ATI FBO color attachment workaround.\n");
-
- if (Bstrstr(glinfo.renderer, "Radeon X1"))
- {
- pr_ati_nodepthoffset = 1;
- initprintf("Enabling ATI R520 polygon offset workaround.\n");
- }
- else
- pr_ati_nodepthoffset = 0;
-#ifdef __APPLE__
- // See bug description at http://lists.apple.com/archives/mac-opengl/2005/Oct/msg00169.html
- if (!Bstrncmp(glinfo.renderer, "ATI Radeon 9600", 15))
- {
- pr_ati_textureformat_one = 1;
- initprintf("Enabling ATI Radeon 9600 texture format workaround.\n");
- }
- else
- pr_ati_textureformat_one = 0;
-#endif
- }
- else
- pr_ati_fboworkaround = 0;
-#endif // defined POLYMER
-
glinfo.maxanisotropy = 1.0;
glinfo.bgra = 0;
glinfo.clamptoedge = 1;
@@ -1356,20 +1327,9 @@ void sdlayer_setvideomode_opengl(void)
glinfo.shadow = !!Bstrstr(glinfo.extensions, "GL_ARB_shadow");
glinfo.fbos = !!Bstrstr(glinfo.extensions, "GL_EXT_framebuffer_object") || !!Bstrstr(glinfo.extensions, "GL_OES_framebuffer_object");
-#if !defined EDUKE32_GLES
- glinfo.texcompr = !!Bstrstr(glinfo.extensions, "GL_ARB_texture_compression") && Bstrcmp(glinfo.vendor, "ATI Technologies Inc.");
-# ifdef DYNAMIC_GLEXT
- if (glinfo.texcompr && (!glCompressedTexImage2D || !glGetCompressedTexImage))
- {
- // lacking the necessary extensions to do this
- initprintf("Warning: the GL driver lacks necessary functions to use caching\n");
- glinfo.texcompr = 0;
- }
-# endif
-
- glinfo.bgra = !!Bstrstr(glinfo.extensions, "GL_EXT_bgra");
- glinfo.clamptoedge = !!Bstrstr(glinfo.extensions, "GL_EXT_texture_edge_clamp") ||
- !!Bstrstr(glinfo.extensions, "GL_SGIS_texture_edge_clamp");
+ glinfo.texcompr = 0;
+ glinfo.bgra = 0;// !!Bstrstr(glinfo.extensions, "GL_EXT_bgra");
+ glinfo.clamptoedge = true;
glinfo.rect =
!!Bstrstr(glinfo.extensions, "GL_NV_texture_rectangle") || !!Bstrstr(glinfo.extensions, "GL_EXT_texture_rectangle");
@@ -1393,10 +1353,6 @@ void sdlayer_setvideomode_opengl(void)
initprintf("3dfx card detected: OpenGL fog disabled\n");
warnonce |= 1;
}
-#else
- // don't bother checking because ETC2 et al. are not listed in extensions anyway
- glinfo.texcompr = 1; // !!Bstrstr(glinfo.extensions, "GL_OES_compressed_ETC1_RGB8_texture");
-#endif
// if (Bstrstr(glinfo.extensions, "GL_EXT_texture_filter_anisotropic"))
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glinfo.maxanisotropy);
diff --git a/source/build/src/texcache.cpp b/source/build/src/texcache.cpp
index 6d9ec552a..5a2b7452f 100644
--- a/source/build/src/texcache.cpp
+++ b/source/build/src/texcache.cpp
@@ -150,7 +150,7 @@ pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int3
{
pth->flags &= ~PTH_INVALIDATED;
- int32_t tilestat = gloadtile_hi(dapicnum, dapalnum, drawingskybox, si, dameth, pth, 0,
+ int32_t tilestat = gloadtile_hi(dapicnum, dapalnum, drawingskybox, si, dameth, pth, 0,
(checktintpal > 0) ? 0 : tintflags); // reload tile
if (!tilestat)
diff --git a/source/build/src/tiles.cpp b/source/build/src/tiles.cpp
index 035a04c68..bf04d367f 100644
--- a/source/build/src/tiles.cpp
+++ b/source/build/src/tiles.cpp
@@ -608,6 +608,7 @@ bool tileLoad(int16_t tileNum)
tileLoadData(tileNum, dasiz, (char *) waloff[tileNum]);
+ /*
#ifdef USE_OPENGL
if (videoGetRenderMode() >= REND_POLYMOST &&
in3dmode())
@@ -620,6 +621,7 @@ bool tileLoad(int16_t tileNum)
}
}
#endif
+*/
tilePostLoad(tileNum);
diff --git a/source/build/src/voxmodel.cpp b/source/build/src/voxmodel.cpp
index ac0ed4f8a..a9d576652 100644
--- a/source/build/src/voxmodel.cpp
+++ b/source/build/src/voxmodel.cpp
@@ -38,7 +38,7 @@ static voxmodel_t *gvox;
//pitch must equal xsiz*4
-uint32_t gloadtex(const int32_t *picbuf, int32_t xsiz, int32_t ysiz, int32_t is8bit, int32_t dapal)
+FHardwareTexture *gloadtex(const int32_t *picbuf, int32_t xsiz, int32_t ysiz, int32_t is8bit, int32_t dapal)
{
const char *const cptr = &britable[gammabrightness ? 0 : curbrightness][0];
@@ -72,17 +72,13 @@ uint32_t gloadtex(const int32_t *picbuf, int32_t xsiz, int32_t ysiz, int32_t is8
}
}
- uint32_t rtexid;
-
- GetTextureHandle((GLuint *) &rtexid);
- glBindTexture(GL_TEXTURE_2D, rtexid);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexImage2D(GL_TEXTURE_2D, 0, 4, xsiz, ysiz, 0, GL_RGBA, GL_UNSIGNED_BYTE, (char *) pic2);
-
+ auto tex = GLInterface.NewTexture();
+ tex->CreateTexture(xsiz, ysiz, false, false);
+ tex->LoadTexture((uint8_t*)pic2); // RGBA
+ tex->SetSampler(SamplerNoFilter);
Bfree(pic2);
- return rtexid;
+ return tex;
}
static int32_t getvox(int32_t x, int32_t y, int32_t z)
@@ -886,7 +882,7 @@ voxmodel_t *voxload(const char *filnam)
vm->piv.x = voxpiv.x; vm->piv.y = voxpiv.y; vm->piv.z = voxpiv.z;
vm->is8bit = is8bit;
- vm->texid = (uint32_t *)Xcalloc(MAXPALOOKUPS, sizeof(uint32_t));
+ vm->texid = (FHardwareTexture * *)Xcalloc(MAXPALOOKUPS, sizeof(FHardwareTexture*));
}
DO_FREE_AND_NULL(shcntmal);
@@ -975,8 +971,6 @@ int32_t polymost_voxdraw(voxmodel_t *m, const uspritetype *tspr)
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
- glEnable(GL_TEXTURE_2D);
-
float pc[4];
pc[0] = pc[1] = pc[2] = ((float)numshades - min(max((globalshade * shadescale) + m->shadeoff, 0.f), (float)numshades)) / (float)numshades;
@@ -1019,8 +1013,8 @@ int32_t polymost_voxdraw(voxmodel_t *m, const uspritetype *tspr)
if (!m->texid[globalpal])
m->texid[globalpal] = gloadtex(m->mytex, m->mytexx, m->mytexy, m->is8bit, globalpal);
- else
- glBindTexture(GL_TEXTURE_2D, m->texid[globalpal]);
+
+ GLInterface.BindTexture(0, m->texid[globalpal]);
polymost_usePaletteIndexing(false);
polymost_setTexturePosSize({ 0.f, 0.f, 1.f, 1.f });
diff --git a/source/build/src/winlayer.cpp b/source/build/src/winlayer.cpp
index 3dd361b57..bf2149c6f 100644
--- a/source/build/src/winlayer.cpp
+++ b/source/build/src/winlayer.cpp
@@ -2745,7 +2745,6 @@ static int32_t SetupOpenGL(int32_t width, int32_t height, int32_t bitspp)
polymost_glreset();
- glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH); //GL_FLAT
glClearColor(0,0,0,0.5); //Black Background
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); //Use FASTEST for ortho!
@@ -2836,11 +2835,13 @@ static int32_t SetupOpenGL(int32_t width, int32_t height, int32_t bitspp)
// supports GL_CLAMP_TO_EDGE or GL_CLAMP_TO_EDGE_SGIS
glinfo.clamptoedge = 1;
}
+ /*
else if (!Bstrcmp((char *)p2, "GL_EXT_bgra"))
{
// support bgra textures
glinfo.bgra = 1;
}
+ */
else if (!Bstrcmp((char *)p2, "GL_ARB_texture_compression") && Bstrcmp(glinfo.vendor,"ATI Technologies Inc."))
{
// support texture compression
diff --git a/source/glbackend/gl_hwtexture.cpp b/source/glbackend/gl_hwtexture.cpp
index 7015c1ca5..531dd0b29 100644
--- a/source/glbackend/gl_hwtexture.cpp
+++ b/source/glbackend/gl_hwtexture.cpp
@@ -66,20 +66,21 @@ unsigned int FHardwareTexture::CreateTexture(int w, int h, bool eightbit, bool m
unsigned int FHardwareTexture::LoadTexture(unsigned char * buffer)
{
if (glTexID == 0) return 0;
-
- int srcformat = glTextureBytes == 1? GL_R8 : GL_RGBA8;// TexFormat[gl_texture_format];
- GLenum srctype = glTextureBytes == 1 ? GL_UNSIGNED_BYTE : (B_BIG_ENDIAN? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_INT_8_8_8_8_REV);
+
+ int dstformat = glTextureBytes == 1? GL_R8 : GL_RGBA8;// TexFormat[gl_texture_format];
+ int srcformat = glTextureBytes == 1 ? GL_RED : GL_BGRA;// TexFormat[gl_texture_format];
glActiveTexture(GL_TEXTURE15);
glBindTexture(GL_TEXTURE_2D, glTexID);
if (glTextureBytes < 4) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, srcformat, srctype, buffer);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, mWidth, mHeight, srcformat, GL_UNSIGNED_BYTE, buffer);
if (mipmapped) glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0);
+ if (glTextureBytes < 4) glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
return glTexID;
}
diff --git a/source/glbackend/gl_hwtexture.h b/source/glbackend/gl_hwtexture.h
index 8942ab73c..2fc02d112 100644
--- a/source/glbackend/gl_hwtexture.h
+++ b/source/glbackend/gl_hwtexture.h
@@ -9,6 +9,7 @@ public:
private:
+ int mSampler = 0;
unsigned int glTexID = 0;
int glTextureBytes = 4;
bool mipmapped = true;
@@ -18,12 +19,13 @@ public:
~FHardwareTexture();
- unsigned int Bind(int texunit, bool needmipmap);
//bool BindOrCreate(FTexture *tex, int texunit, int clampmode, int translation, int flags);
unsigned int CreateTexture(int w, int h, bool eightbit, bool mipmapped);
unsigned int LoadTexture(unsigned char * buffer);
unsigned int GetTextureHandle();
+ int GetSampler() { return mSampler; }
+ void SetSampler(int sampler) { mSampler = sampler; }
};
#endif
diff --git a/source/glbackend/glbackend.cpp b/source/glbackend/glbackend.cpp
index 486f94d49..08c804b1d 100644
--- a/source/glbackend/glbackend.cpp
+++ b/source/glbackend/glbackend.cpp
@@ -6,8 +6,11 @@ GLInstance GLInterface;
void GLInstance::Init()
{
- mSamplers = new FSamplerManager;
- memset(LastBoundTextures, 0, sizeof(LastBoundTextures));
+ if (!mSamplers)
+ {
+ mSamplers = new FSamplerManager;
+ memset(LastBoundTextures, 0, sizeof(LastBoundTextures));
+ }
}
void GLInstance::Deinit()
@@ -55,14 +58,19 @@ int GLInstance::GetTextureID()
return TextureHandleCache[currentindex];
}
-void GLInstance::BindTexture(int texunit, int tex, int sampler)
+FHardwareTexture* GLInstance::NewTexture()
{
+ return new FHardwareTexture;
+}
+
+void GLInstance::BindTexture(int texunit, FHardwareTexture *tex, int sampler)
+{
+ if (!tex) return;
if (texunit != 0) glActiveTexture(GL_TEXTURE0 + texunit);
- glBindTexture(GL_TEXTURE_2D, tex);
- if (sampler != NoSampler) mSamplers->Bind(texunit, sampler, 0);
- else glBindSampler(texunit, 0);
+ glBindTexture(GL_TEXTURE_2D, tex->GetTextureHandle());
+ mSamplers->Bind(texunit, sampler == NoSampler? tex->GetSampler() : sampler, 0);
if (texunit != 0) glActiveTexture(GL_TEXTURE0);
- LastBoundTextures[texunit] = tex;
+ LastBoundTextures[texunit] = tex->GetTextureHandle();
}
void GLInstance::UnbindTexture(int texunit)
diff --git a/source/glbackend/glbackend.h b/source/glbackend/glbackend.h
index a9df4bc81..3894e158d 100644
--- a/source/glbackend/glbackend.h
+++ b/source/glbackend/glbackend.h
@@ -74,7 +74,8 @@ public:
void Draw(EDrawType type, size_t start, size_t count);
int GetTextureID();
- void BindTexture(int texunit, int texid, int sampler = NoSampler);
+ FHardwareTexture* NewTexture();
+ void BindTexture(int texunit, FHardwareTexture *texid, int sampler = NoSampler);
void UnbindTexture(int texunit);
void UnbindAllTextures();