require opengl4

gl4
Daniel Kolesa 2018-10-28 16:44:48 +01:00
parent 651c6e2b56
commit 63fc838fde
11 changed files with 216 additions and 795 deletions

View File

@ -8,7 +8,6 @@ VARF(tqaamovemask, 0, 1, 1, cleanupaa());
VARP(tqaaquincunx, 0, 1, 1);
FVAR(tqaacolorweightscale, 0, 0.25f, 1e3f);
FVAR(tqaacolorweightbias, 0, 0.01f, 1);
VAR(tqaaresolvegather, 1, 0, 0);
int tqaaframe = 0;
GLuint tqaatex[2] = { 0, 0 }, tqaafbo[2] = { 0, 0 };
@ -202,7 +201,6 @@ void loadsmaashaders(bool split = false)
string opts;
int optslen = 0;
if(!hasTRG) opts[optslen++] = 'a';
if((smaadepthmask && (!tqaa || msaalight)) || (smaastencil && ghasstencil > (msaasamples ? 1 : 0))) opts[optslen++] = 'd';
if(split) opts[optslen++] = 's';
if(tqaa || smaagreenluma || intel_texalpha_bug) opts[optslen++] = 'g';
@ -505,8 +503,8 @@ void setupsmaa(int w, int h)
if(!smaasearchtex) glGenTextures(1, &smaasearchtex);
gensmaasearchdata();
gensmaaareadata();
createtexture(smaaareatex, SMAA_AREATEX_WIDTH, SMAA_AREATEX_HEIGHT, smaaareadata, 3, 1, hasTRG ? GL_RG8 : GL_LUMINANCE8_ALPHA8, GL_TEXTURE_RECTANGLE, 0, 0, 0, false);
createtexture(smaasearchtex, SMAA_SEARCHTEX_WIDTH, SMAA_SEARCHTEX_HEIGHT, smaasearchdata, 3, 0, hasTRG ? GL_R8 : GL_LUMINANCE8, GL_TEXTURE_RECTANGLE, 0, 0, 0, false);
createtexture(smaaareatex, SMAA_AREATEX_WIDTH, SMAA_AREATEX_HEIGHT, smaaareadata, 3, 1, GL_RG8, GL_TEXTURE_RECTANGLE, 0, 0, 0, false);
createtexture(smaasearchtex, SMAA_SEARCHTEX_WIDTH, SMAA_SEARCHTEX_HEIGHT, smaasearchdata, 3, 0, GL_R8, GL_TEXTURE_RECTANGLE, 0, 0, 0, false);
bool split = multisampledaa();
smaasubsampleorder = split ? (msaapositions[0].x < 0.5f ? 1 : 0) : -1;
smaat2x = tqaa ? 1 : 0;
@ -521,7 +519,7 @@ void setupsmaa(int w, int h)
switch(i)
{
case 0: format = tqaa || (!smaagreenluma && !intel_texalpha_bug && !smaacoloredge) ? GL_RGBA8 : GL_RGB; break;
case 1: format = hasTRG ? GL_RG8 : GL_RGBA8; break;
case 1: format = GL_RG8; break;
case 2: case 3: format = GL_RGBA8; break;
}
createtexture(smaatex[i], w, h, NULL, 3, 1, format, GL_TEXTURE_RECTANGLE);

View File

@ -590,7 +590,7 @@ struct BlendBrush
{
loopj(w) *dst++ = 255 - *src++;
}
createtexture(tex, w, h, buf, 3, 1, hasTRG ? GL_R8 : GL_LUMINANCE8);
createtexture(tex, w, h, buf, 3, 1, GL_R8);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
GLfloat border[4] = { 0, 0, 0, 0 };
@ -653,8 +653,8 @@ struct BlendTexture
size = sz;
if(data) delete[] data;
data = new uchar[size*size];
format = hasTRG ? GL_RED : GL_LUMINANCE;
createtexture(tex, size, size, NULL, 3, 1, hasTRG ? GL_R8 : GL_LUMINANCE8);
format = GL_RED;
createtexture(tex, size, size, NULL, 3, 1, GL_R8);
valid = false;
return true;
}

View File

@ -120,8 +120,7 @@ static inline bool pvsoccluded(const ivec &bborigin, int size)
}
// rendergl
extern bool hasVAO, hasTR, hasTSW, hasPBO, hasFBO, hasAFBO, hasDS, hasTF, hasCBF, hasS3TC, hasFXT1, hasLATC, hasRGTC, hasAF, hasFBB, hasFBMS, hasTMS, hasMSS, hasFBMSBS, hasUBO, hasMBR, hasDB2, hasDBB, hasTG, hasTQ, hasPF, hasTRG, hasTI, hasHFV, hasHFP, hasDBT, hasDC, hasDBGO, hasEGPU4, hasGPU4, hasGPU5, hasBFE, hasEAL, hasCR, hasOQ2, hasES3, hasCB, hasCI;
extern int glversion, glslversion, glcompat;
extern bool hasS3TC, hasFXT1, hasLATC, hasAF, hasFBMSBS, hasDBT, hasDBGO, hasES3, hasCI;
extern int maxdrawbufs, maxdualdrawbufs;
enum { DRAWTEX_NONE = 0, DRAWTEX_ENVMAP, DRAWTEX_MINIMAP, DRAWTEX_MODELPREVIEW };

View File

@ -556,20 +556,10 @@ void setupscreen()
SDL_SetWindowMinimumSize(screen, SCR_MINW, SCR_MINH);
SDL_SetWindowMaximumSize(screen, SCR_MAXW, SCR_MAXH);
#ifdef __APPLE__
static const int glversions[] = { 32, 20 };
#else
static const int glversions[] = { 40, 33, 32, 31, 30, 20 };
#endif
loopi(sizeof(glversions)/sizeof(glversions[0]))
{
glcompat = glversions[i] <= 30 ? 1 : 0;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, glversions[i] / 10);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, glversions[i] % 10);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, glversions[i] >= 32 ? SDL_GL_CONTEXT_PROFILE_CORE : 0);
glcontext = SDL_GL_CreateContext(screen);
if(glcontext) break;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
glcontext = SDL_GL_CreateContext(screen);
if(!glcontext) fatal("failed to create OpenGL context: %s", SDL_GetError());
SDL_GetWindowSize(screen, &screenw, &screenh);

View File

@ -1017,7 +1017,7 @@ namespace recorder
if(usefbo)
{
uint tw = screenw, th = screenh;
if(hasFBB && movieaccelblit) { tw = max(tw/2, m.w); th = max(th/2, m.h); }
if(movieaccelblit) { tw = max(tw/2, m.w); th = max(th/2, m.h); }
if(tw != scalew || th != scaleh)
{
if(!scalefb) glGenFramebuffers_(1, &scalefb);

View File

@ -2,14 +2,12 @@
#include "engine.h"
bool hasVAO = false, hasTR = false, hasTSW = false, hasPBO = false, hasFBO = false, hasAFBO = false, hasDS = false, hasTF = false, hasCBF = false, hasS3TC = false, hasFXT1 = false, hasLATC = false, hasRGTC = false, hasAF = false, hasFBB = false, hasFBMS = false, hasTMS = false, hasMSS = false, hasFBMSBS = false, hasUBO = false, hasMBR = false, hasDB2 = false, hasDBB = false, hasTG = false, hasTQ = false, hasPF = false, hasTRG = false, hasTI = false, hasHFV = false, hasHFP = false, hasDBT = false, hasDC = false, hasDBGO = false, hasEGPU4 = false, hasGPU4 = false, hasGPU5 = false, hasBFE = false, hasEAL = false, hasCR = false, hasOQ2 = false, hasES3 = false, hasCB = false, hasCI = false;
bool hasS3TC = false, hasFXT1 = false, hasLATC = false, hasAF = false, hasFBMSBS = false, hasDBT = false, hasDBGO = false, hasES3 = false, hasCI = false;
bool mesa = false, intel = false, amd = false, nvidia = false;
int hasstencil = 0;
VAR(glversion, 1, 0, 0);
VAR(glslversion, 1, 0, 0);
VAR(glcompat, 1, 0, 0);
// GL_EXT_timer_query
PFNGLGETQUERYOBJECTI64VEXTPROC glGetQueryObjecti64v_ = NULL;
@ -268,13 +266,9 @@ void glerror(const char *file, int line, GLenum error)
printf("GL error: %s:%d: %s (%x)\n", file, line, desc, error);
}
VAR(amd_pf_bug, 0, 0, 1);
VAR(amd_eal_bug, 0, 0, 1);
VAR(mesa_texrectoffset_bug, 0, 0, 1);
VAR(intel_texalpha_bug, 0, 0, 1);
VAR(intel_mapbufferrange_bug, 0, 0, 1);
VAR(mesa_swap_bug, 0, 0, 1);
VAR(useubo, 1, 0, 0);
VAR(usetexgather, 1, 0, 0);
VAR(usetexcompress, 1, 0, 0);
VAR(maxdrawbufs, 1, 0, 0);
@ -308,27 +302,12 @@ hashset<const char *> glexts;
void parseglexts()
{
if(glversion >= 300)
GLint numexts = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &numexts);
loopi(numexts)
{
GLint numexts = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &numexts);
loopi(numexts)
{
const char *ext = (const char *)glGetStringi_(GL_EXTENSIONS, i);
glexts.add(newstring(ext));
}
}
else
{
const char *exts = (const char *)glGetString(GL_EXTENSIONS);
for(;;)
{
while(*exts == ' ') exts++;
if(!*exts) break;
const char *ext = exts;
while(*exts && *exts != ' ') exts++;
if(exts > ext) glexts.add(newstring(ext, size_t(exts-ext)));
}
const char *ext = (const char *)glGetStringi_(GL_EXTENSIONS, i);
glexts.add(newstring(ext));
}
}
@ -375,11 +354,6 @@ void gl_checkextensions()
conoutf(CON_INIT, "Renderer: %s (%s)", renderer, vendor);
conoutf(CON_INIT, "Driver: %s", version);
#ifdef __APPLE__
// extern int mac_osversion();
// int osversion = mac_osversion(); /* 0x0A0600 = 10.6, assumed minimum */
#endif
if(strstr(renderer, "Mesa") || strstr(version, "Mesa"))
{
mesa = true;
@ -396,7 +370,7 @@ void gl_checkextensions()
if(sscanf(version, " %u.%u", &glmajorversion, &glminorversion) != 2) glversion = 100;
else glversion = glmajorversion*100 + glminorversion*10;
if(glversion < 200) fatal("OpenGL 2.0 or greater is required!");
if(glversion < 400) fatal("OpenGL 4.0 or greater is required!");
#ifdef WIN32
glActiveTexture_ = (PFNGLACTIVETEXTUREPROC) getprocaddress("glActiveTexture");
@ -516,19 +490,11 @@ void gl_checkextensions()
glDrawBuffers_ = (PFNGLDRAWBUFFERSPROC) getprocaddress("glDrawBuffers");
#endif
if(glversion >= 300)
{
glGetStringi_ = (PFNGLGETSTRINGIPROC) getprocaddress("glGetStringi");
}
glGetStringi_ = (PFNGLGETSTRINGIPROC) getprocaddress("glGetStringi");
const char *glslstr = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
conoutf(CON_INIT, "GLSL: %s", glslstr ? glslstr : "unknown");
uint glslmajorversion, glslminorversion;
if(glslstr && sscanf(glslstr, " %u.%u", &glslmajorversion, &glslminorversion) == 2) glslversion = glslmajorversion*100 + glslminorversion;
if(glslversion < 120) fatal("GLSL 1.20 or greater is required!");
parseglexts();
GLint texsize = 0, texunits = 0, vtexunits = 0, cubetexsize = 0, drawbufs = 0;
@ -550,292 +516,82 @@ void gl_checkextensions()
maxdrawbufs = drawbufs;
if(maxdrawbufs < 4) fatal("Hardware does not support at least 4 draw buffers.");
if(glversion >= 210 || hasext("GL_ARB_pixel_buffer_object") || hasext("GL_EXT_pixel_buffer_object"))
{
hasPBO = true;
if(glversion < 210 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_pixel_buffer_object extension.");
}
else fatal("Pixel buffer object support is required!");
glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) getprocaddress("glBindVertexArray");
glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC)getprocaddress("glDeleteVertexArrays");
glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) getprocaddress("glGenVertexArrays");
glIsVertexArray_ = (PFNGLISVERTEXARRAYPROC) getprocaddress("glIsVertexArray");
if(glversion >= 300 || hasext("GL_ARB_vertex_array_object"))
{
glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) getprocaddress("glBindVertexArray");
glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC)getprocaddress("glDeleteVertexArrays");
glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) getprocaddress("glGenVertexArrays");
glIsVertexArray_ = (PFNGLISVERTEXARRAYPROC) getprocaddress("glIsVertexArray");
hasVAO = true;
if(glversion < 300 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_vertex_array_object extension.");
}
else if(hasext("GL_APPLE_vertex_array_object"))
{
glBindVertexArray_ = (PFNGLBINDVERTEXARRAYPROC) getprocaddress("glBindVertexArrayAPPLE");
glDeleteVertexArrays_ = (PFNGLDELETEVERTEXARRAYSPROC)getprocaddress("glDeleteVertexArraysAPPLE");
glGenVertexArrays_ = (PFNGLGENVERTEXARRAYSPROC) getprocaddress("glGenVertexArraysAPPLE");
glIsVertexArray_ = (PFNGLISVERTEXARRAYPROC) getprocaddress("glIsVertexArrayAPPLE");
hasVAO = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_APPLE_vertex_array_object extension.");
}
glBindFragDataLocation_ = (PFNGLBINDFRAGDATALOCATIONPROC)getprocaddress("glBindFragDataLocation");
glUniform1ui_ = (PFNGLUNIFORM1UIPROC) getprocaddress("glUniform1ui");
glUniform2ui_ = (PFNGLUNIFORM2UIPROC) getprocaddress("glUniform2ui");
glUniform3ui_ = (PFNGLUNIFORM3UIPROC) getprocaddress("glUniform3ui");
glUniform4ui_ = (PFNGLUNIFORM4UIPROC) getprocaddress("glUniform4ui");
glUniform1uiv_ = (PFNGLUNIFORM1UIVPROC) getprocaddress("glUniform1uiv");
glUniform2uiv_ = (PFNGLUNIFORM2UIVPROC) getprocaddress("glUniform2uiv");
glUniform3uiv_ = (PFNGLUNIFORM3UIVPROC) getprocaddress("glUniform3uiv");
glUniform4uiv_ = (PFNGLUNIFORM4UIVPROC) getprocaddress("glUniform4uiv");
glClearBufferiv_ = (PFNGLCLEARBUFFERIVPROC) getprocaddress("glClearBufferiv");
glClearBufferuiv_ = (PFNGLCLEARBUFFERUIVPROC) getprocaddress("glClearBufferuiv");
glClearBufferfv_ = (PFNGLCLEARBUFFERFVPROC) getprocaddress("glClearBufferfv");
glClearBufferfi_ = (PFNGLCLEARBUFFERFIPROC) getprocaddress("glClearBufferfi");
if(glversion >= 300)
{
hasTF = hasTRG = hasRGTC = hasPF = hasHFV = hasHFP = true;
glClampColor_ = (PFNGLCLAMPCOLORPROC)getprocaddress("glClampColor");
glBindFragDataLocation_ = (PFNGLBINDFRAGDATALOCATIONPROC)getprocaddress("glBindFragDataLocation");
glUniform1ui_ = (PFNGLUNIFORM1UIPROC) getprocaddress("glUniform1ui");
glUniform2ui_ = (PFNGLUNIFORM2UIPROC) getprocaddress("glUniform2ui");
glUniform3ui_ = (PFNGLUNIFORM3UIPROC) getprocaddress("glUniform3ui");
glUniform4ui_ = (PFNGLUNIFORM4UIPROC) getprocaddress("glUniform4ui");
glUniform1uiv_ = (PFNGLUNIFORM1UIVPROC) getprocaddress("glUniform1uiv");
glUniform2uiv_ = (PFNGLUNIFORM2UIVPROC) getprocaddress("glUniform2uiv");
glUniform3uiv_ = (PFNGLUNIFORM3UIVPROC) getprocaddress("glUniform3uiv");
glUniform4uiv_ = (PFNGLUNIFORM4UIVPROC) getprocaddress("glUniform4uiv");
glClearBufferiv_ = (PFNGLCLEARBUFFERIVPROC) getprocaddress("glClearBufferiv");
glClearBufferuiv_ = (PFNGLCLEARBUFFERUIVPROC) getprocaddress("glClearBufferuiv");
glClearBufferfv_ = (PFNGLCLEARBUFFERFVPROC) getprocaddress("glClearBufferfv");
glClearBufferfi_ = (PFNGLCLEARBUFFERFIPROC) getprocaddress("glClearBufferfi");
hasGPU4 = true;
glColorMaski_ = (PFNGLCOLORMASKIPROC)getprocaddress("glColorMaski");
glEnablei_ = (PFNGLENABLEIPROC) getprocaddress("glEnablei");
glDisablei_ = (PFNGLENABLEIPROC) getprocaddress("glDisablei");
if(hasext("GL_EXT_gpu_shader4"))
{
hasEGPU4 = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_gpu_shader4 extension.");
}
glBeginConditionalRender_ = (PFNGLBEGINCONDITIONALRENDERPROC)getprocaddress("glBeginConditionalRender");
glEndConditionalRender_ = (PFNGLENDCONDITIONALRENDERPROC) getprocaddress("glEndConditionalRender");
glClampColor_ = (PFNGLCLAMPCOLORPROC)getprocaddress("glClampColor");
hasCBF = true;
glTexParameterIiv_ = (PFNGLTEXPARAMETERIIVPROC) getprocaddress("glTexParameterIiv");
glTexParameterIuiv_ = (PFNGLTEXPARAMETERIUIVPROC) getprocaddress("glTexParameterIuiv");
glGetTexParameterIiv_ = (PFNGLGETTEXPARAMETERIIVPROC) getprocaddress("glGetTexParameterIiv");
glGetTexParameterIuiv_ = (PFNGLGETTEXPARAMETERIUIVPROC)getprocaddress("glGetTexParameterIuiv");
glColorMaski_ = (PFNGLCOLORMASKIPROC)getprocaddress("glColorMaski");
glEnablei_ = (PFNGLENABLEIPROC) getprocaddress("glEnablei");
glDisablei_ = (PFNGLENABLEIPROC) getprocaddress("glDisablei");
hasDB2 = true;
glBindRenderbuffer_ = (PFNGLBINDRENDERBUFFERPROC) getprocaddress("glBindRenderbuffer");
glDeleteRenderbuffers_ = (PFNGLDELETERENDERBUFFERSPROC) getprocaddress("glDeleteRenderbuffers");
glGenRenderbuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenRenderbuffers");
glRenderbufferStorage_ = (PFNGLRENDERBUFFERSTORAGEPROC) getprocaddress("glRenderbufferStorage");
glGetRenderbufferParameteriv_ = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) getprocaddress("glGetRenderbufferParameteriv");
glCheckFramebufferStatus_ = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) getprocaddress("glCheckFramebufferStatus");
glBindFramebuffer_ = (PFNGLBINDFRAMEBUFFERPROC) getprocaddress("glBindFramebuffer");
glDeleteFramebuffers_ = (PFNGLDELETEFRAMEBUFFERSPROC) getprocaddress("glDeleteFramebuffers");
glGenFramebuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenFramebuffers");
glFramebufferTexture1D_ = (PFNGLFRAMEBUFFERTEXTURE1DPROC) getprocaddress("glFramebufferTexture1D");
glFramebufferTexture2D_ = (PFNGLFRAMEBUFFERTEXTURE2DPROC) getprocaddress("glFramebufferTexture2D");
glFramebufferTexture3D_ = (PFNGLFRAMEBUFFERTEXTURE3DPROC) getprocaddress("glFramebufferTexture3D");
glFramebufferRenderbuffer_ = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) getprocaddress("glFramebufferRenderbuffer");
glGenerateMipmap_ = (PFNGLGENERATEMIPMAPPROC) getprocaddress("glGenerateMipmap");
glBlitFramebuffer_ = (PFNGLBLITFRAMEBUFFERPROC) getprocaddress("glBlitFramebuffer");
glRenderbufferStorageMultisample_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)getprocaddress("glRenderbufferStorageMultisample");
glBeginConditionalRender_ = (PFNGLBEGINCONDITIONALRENDERPROC)getprocaddress("glBeginConditionalRender");
glEndConditionalRender_ = (PFNGLENDCONDITIONALRENDERPROC) getprocaddress("glEndConditionalRender");
hasCR = true;
glMapBufferRange_ = (PFNGLMAPBUFFERRANGEPROC) getprocaddress("glMapBufferRange");
glFlushMappedBufferRange_ = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)getprocaddress("glFlushMappedBufferRange");
glTexParameterIiv_ = (PFNGLTEXPARAMETERIIVPROC) getprocaddress("glTexParameterIiv");
glTexParameterIuiv_ = (PFNGLTEXPARAMETERIUIVPROC) getprocaddress("glTexParameterIuiv");
glGetTexParameterIiv_ = (PFNGLGETTEXPARAMETERIIVPROC) getprocaddress("glGetTexParameterIiv");
glGetTexParameterIuiv_ = (PFNGLGETTEXPARAMETERIUIVPROC)getprocaddress("glGetTexParameterIuiv");
hasTI = true;
}
else
{
if(hasext("GL_ARB_texture_float"))
{
hasTF = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_float extension.");
}
if(hasext("GL_ARB_texture_rg"))
{
hasTRG = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_rg extension.");
}
if(hasext("GL_ARB_texture_compression_rgtc") || hasext("GL_EXT_texture_compression_rgtc"))
{
hasRGTC = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_compression_rgtc extension.");
}
if(hasext("GL_EXT_packed_float"))
{
hasPF = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_packed_float extension.");
}
if(hasext("GL_EXT_gpu_shader4"))
{
glBindFragDataLocation_ = (PFNGLBINDFRAGDATALOCATIONPROC)getprocaddress("glBindFragDataLocationEXT");
glUniform1ui_ = (PFNGLUNIFORM1UIPROC) getprocaddress("glUniform1uiEXT");
glUniform2ui_ = (PFNGLUNIFORM2UIPROC) getprocaddress("glUniform2uiEXT");
glUniform3ui_ = (PFNGLUNIFORM3UIPROC) getprocaddress("glUniform3uiEXT");
glUniform4ui_ = (PFNGLUNIFORM4UIPROC) getprocaddress("glUniform4uiEXT");
glUniform1uiv_ = (PFNGLUNIFORM1UIVPROC) getprocaddress("glUniform1uivEXT");
glUniform2uiv_ = (PFNGLUNIFORM2UIVPROC) getprocaddress("glUniform2uivEXT");
glUniform3uiv_ = (PFNGLUNIFORM3UIVPROC) getprocaddress("glUniform3uivEXT");
glUniform4uiv_ = (PFNGLUNIFORM4UIVPROC) getprocaddress("glUniform4uivEXT");
hasEGPU4 = hasGPU4 = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_gpu_shader4 extension.");
}
if(hasext("GL_ARB_color_buffer_float"))
{
glClampColor_ = (PFNGLCLAMPCOLORPROC)getprocaddress("glClampColorARB");
hasCBF = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_color_buffer_float extension.");
}
if(hasext("GL_EXT_draw_buffers2"))
{
glColorMaski_ = (PFNGLCOLORMASKIPROC)getprocaddress("glColorMaskIndexedEXT");
glEnablei_ = (PFNGLENABLEIPROC) getprocaddress("glEnableIndexedEXT");
glDisablei_ = (PFNGLENABLEIPROC) getprocaddress("glDisableIndexedEXT");
hasDB2 = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_draw_buffers2 extension.");
}
if(hasext("GL_NV_conditional_render"))
{
glBeginConditionalRender_ = (PFNGLBEGINCONDITIONALRENDERPROC)getprocaddress("glBeginConditionalRenderNV");
glEndConditionalRender_ = (PFNGLENDCONDITIONALRENDERPROC) getprocaddress("glEndConditionalRenderNV");
hasCR = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_NV_conditional_render extension.");
}
if(hasext("GL_EXT_texture_integer"))
{
glTexParameterIiv_ = (PFNGLTEXPARAMETERIIVPROC) getprocaddress("glTexParameterIivEXT");
glTexParameterIuiv_ = (PFNGLTEXPARAMETERIUIVPROC) getprocaddress("glTexParameterIuivEXT");
glGetTexParameterIiv_ = (PFNGLGETTEXPARAMETERIIVPROC) getprocaddress("glGetTexParameterIivEXT");
glGetTexParameterIuiv_ = (PFNGLGETTEXPARAMETERIUIVPROC)getprocaddress("glGetTexParameterIuivEXT");
glClearColorIi_ = (PFNGLCLEARCOLORIIEXTPROC) getprocaddress("glClearColorIiEXT");
glClearColorIui_ = (PFNGLCLEARCOLORIUIEXTPROC) getprocaddress("glClearColorIuiEXT");
hasTI = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_texture_integer extension.");
}
if(hasext("GL_NV_half_float"))
{
hasHFV = hasHFP = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_NV_half_float extension.");
}
else
{
if(hasext("GL_ARB_half_float_vertex"))
{
hasHFV = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_half_float_vertex extension.");
}
if(hasext("GL_ARB_half_float_pixel"))
{
hasHFP = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_half_float_pixel extension.");
}
}
}
glGetUniformIndices_ = (PFNGLGETUNIFORMINDICESPROC) getprocaddress("glGetUniformIndices");
glGetActiveUniformsiv_ = (PFNGLGETACTIVEUNIFORMSIVPROC) getprocaddress("glGetActiveUniformsiv");
glGetUniformBlockIndex_ = (PFNGLGETUNIFORMBLOCKINDEXPROC) getprocaddress("glGetUniformBlockIndex");
glGetActiveUniformBlockiv_ = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)getprocaddress("glGetActiveUniformBlockiv");
glUniformBlockBinding_ = (PFNGLUNIFORMBLOCKBINDINGPROC) getprocaddress("glUniformBlockBinding");
glBindBufferBase_ = (PFNGLBINDBUFFERBASEPROC) getprocaddress("glBindBufferBase");
glBindBufferRange_ = (PFNGLBINDBUFFERRANGEPROC) getprocaddress("glBindBufferRange");
if(!hasHFV) fatal("Half-precision floating-point support is required!");
glCopyBufferSubData_ = (PFNGLCOPYBUFFERSUBDATAPROC)getprocaddress("glCopyBufferSubData");
if(glversion >= 300 || hasext("GL_ARB_framebuffer_object"))
{
glBindRenderbuffer_ = (PFNGLBINDRENDERBUFFERPROC) getprocaddress("glBindRenderbuffer");
glDeleteRenderbuffers_ = (PFNGLDELETERENDERBUFFERSPROC) getprocaddress("glDeleteRenderbuffers");
glGenRenderbuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenRenderbuffers");
glRenderbufferStorage_ = (PFNGLRENDERBUFFERSTORAGEPROC) getprocaddress("glRenderbufferStorage");
glGetRenderbufferParameteriv_ = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) getprocaddress("glGetRenderbufferParameteriv");
glCheckFramebufferStatus_ = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) getprocaddress("glCheckFramebufferStatus");
glBindFramebuffer_ = (PFNGLBINDFRAMEBUFFERPROC) getprocaddress("glBindFramebuffer");
glDeleteFramebuffers_ = (PFNGLDELETEFRAMEBUFFERSPROC) getprocaddress("glDeleteFramebuffers");
glGenFramebuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenFramebuffers");
glFramebufferTexture1D_ = (PFNGLFRAMEBUFFERTEXTURE1DPROC) getprocaddress("glFramebufferTexture1D");
glFramebufferTexture2D_ = (PFNGLFRAMEBUFFERTEXTURE2DPROC) getprocaddress("glFramebufferTexture2D");
glFramebufferTexture3D_ = (PFNGLFRAMEBUFFERTEXTURE3DPROC) getprocaddress("glFramebufferTexture3D");
glFramebufferRenderbuffer_ = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) getprocaddress("glFramebufferRenderbuffer");
glGenerateMipmap_ = (PFNGLGENERATEMIPMAPPROC) getprocaddress("glGenerateMipmap");
glBlitFramebuffer_ = (PFNGLBLITFRAMEBUFFERPROC) getprocaddress("glBlitFramebuffer");
glRenderbufferStorageMultisample_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)getprocaddress("glRenderbufferStorageMultisample");
glTexImage2DMultisample_ = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)getprocaddress("glTexImage2DMultisample");
glTexImage3DMultisample_ = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)getprocaddress("glTexImage3DMultisample");
glGetMultisamplefv_ = (PFNGLGETMULTISAMPLEFVPROC) getprocaddress("glGetMultisamplefv");
glSampleMaski_ = (PFNGLSAMPLEMASKIPROC) getprocaddress("glSampleMaski");
hasAFBO = hasFBO = hasFBB = hasFBMS = hasDS = true;
if(glversion < 300 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_framebuffer_object extension.");
}
else if(hasext("GL_EXT_framebuffer_object"))
{
glBindRenderbuffer_ = (PFNGLBINDRENDERBUFFERPROC) getprocaddress("glBindRenderbufferEXT");
glDeleteRenderbuffers_ = (PFNGLDELETERENDERBUFFERSPROC) getprocaddress("glDeleteRenderbuffersEXT");
glGenRenderbuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenRenderbuffersEXT");
glRenderbufferStorage_ = (PFNGLRENDERBUFFERSTORAGEPROC) getprocaddress("glRenderbufferStorageEXT");
glGetRenderbufferParameteriv_ = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)getprocaddress("glGetRenderbufferParameterivEXT");
glCheckFramebufferStatus_ = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) getprocaddress("glCheckFramebufferStatusEXT");
glBindFramebuffer_ = (PFNGLBINDFRAMEBUFFERPROC) getprocaddress("glBindFramebufferEXT");
glDeleteFramebuffers_ = (PFNGLDELETEFRAMEBUFFERSPROC) getprocaddress("glDeleteFramebuffersEXT");
glGenFramebuffers_ = (PFNGLGENFRAMEBUFFERSPROC) getprocaddress("glGenFramebuffersEXT");
glFramebufferTexture1D_ = (PFNGLFRAMEBUFFERTEXTURE1DPROC) getprocaddress("glFramebufferTexture1DEXT");
glFramebufferTexture2D_ = (PFNGLFRAMEBUFFERTEXTURE2DPROC) getprocaddress("glFramebufferTexture2DEXT");
glFramebufferTexture3D_ = (PFNGLFRAMEBUFFERTEXTURE3DPROC) getprocaddress("glFramebufferTexture3DEXT");
glFramebufferRenderbuffer_ = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) getprocaddress("glFramebufferRenderbufferEXT");
glGenerateMipmap_ = (PFNGLGENERATEMIPMAPPROC) getprocaddress("glGenerateMipmapEXT");
hasFBO = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_framebuffer_object extension.");
if(hasext("GL_EXT_framebuffer_blit"))
{
glBlitFramebuffer_ = (PFNGLBLITFRAMEBUFFERPROC) getprocaddress("glBlitFramebufferEXT");
hasFBB = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_framebuffer_blit extension.");
}
if(hasext("GL_EXT_framebuffer_multisample"))
{
glRenderbufferStorageMultisample_ = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)getprocaddress("glRenderbufferStorageMultisampleEXT");
hasFBMS = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_framebuffer_multisample extension.");
}
if(hasext("GL_EXT_packed_depth_stencil") || hasext("GL_NV_packed_depth_stencil"))
{
hasDS = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_packed_depth_stencil extension.");
}
}
else fatal("Framebuffer object support is required!");
if(glversion >= 300 || hasext("GL_ARB_map_buffer_range"))
{
glMapBufferRange_ = (PFNGLMAPBUFFERRANGEPROC) getprocaddress("glMapBufferRange");
glFlushMappedBufferRange_ = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)getprocaddress("glFlushMappedBufferRange");
hasMBR = true;
if(glversion < 300 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_map_buffer_range.");
}
if(glversion >= 310 || hasext("GL_ARB_uniform_buffer_object"))
{
glGetUniformIndices_ = (PFNGLGETUNIFORMINDICESPROC) getprocaddress("glGetUniformIndices");
glGetActiveUniformsiv_ = (PFNGLGETACTIVEUNIFORMSIVPROC) getprocaddress("glGetActiveUniformsiv");
glGetUniformBlockIndex_ = (PFNGLGETUNIFORMBLOCKINDEXPROC) getprocaddress("glGetUniformBlockIndex");
glGetActiveUniformBlockiv_ = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)getprocaddress("glGetActiveUniformBlockiv");
glUniformBlockBinding_ = (PFNGLUNIFORMBLOCKBINDINGPROC) getprocaddress("glUniformBlockBinding");
glBindBufferBase_ = (PFNGLBINDBUFFERBASEPROC) getprocaddress("glBindBufferBase");
glBindBufferRange_ = (PFNGLBINDBUFFERRANGEPROC) getprocaddress("glBindBufferRange");
useubo = 1;
hasUBO = true;
if(glversion < 310 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_uniform_buffer_object extension.");
}
if(glversion >= 310 || hasext("GL_ARB_texture_rectangle"))
{
hasTR = true;
if(glversion < 310 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_rectangle extension.");
}
else fatal("Texture rectangle support is required!");
if(glversion >= 310 || hasext("GL_ARB_copy_buffer"))
{
glCopyBufferSubData_ = (PFNGLCOPYBUFFERSUBDATAPROC)getprocaddress("glCopyBufferSubData");
hasCB = true;
if(glversion < 310 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_copy_buffer extension.");
}
if(glversion >= 320 || hasext("GL_ARB_texture_multisample"))
{
glTexImage2DMultisample_ = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)getprocaddress("glTexImage2DMultisample");
glTexImage3DMultisample_ = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)getprocaddress("glTexImage3DMultisample");
glGetMultisamplefv_ = (PFNGLGETMULTISAMPLEFVPROC) getprocaddress("glGetMultisamplefv");
glSampleMaski_ = (PFNGLSAMPLEMASKIPROC) getprocaddress("glSampleMaski");
hasTMS = true;
if(glversion < 320 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_multisample extension.");
}
if(hasext("GL_EXT_framebuffer_multisample_blit_scaled"))
{
hasFBMSBS = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_framebuffer_multisample_blit_scaled extension.");
}
if(hasext("GL_EXT_timer_query"))
{
glGetQueryObjecti64v_ = (PFNGLGETQUERYOBJECTI64VEXTPROC) getprocaddress("glGetQueryObjecti64vEXT");
glGetQueryObjectui64v_ = (PFNGLGETQUERYOBJECTUI64VEXTPROC) getprocaddress("glGetQueryObjectui64vEXT");
hasTQ = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_timer_query extension.");
}
else if(glversion >= 330 || hasext("GL_ARB_timer_query"))
{
glGetQueryObjecti64v_ = (PFNGLGETQUERYOBJECTI64VEXTPROC) getprocaddress("glGetQueryObjecti64v");
glGetQueryObjectui64v_ = (PFNGLGETQUERYOBJECTUI64VEXTPROC) getprocaddress("glGetQueryObjectui64v");
hasTQ = true;
if(glversion < 330 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_timer_query extension.");
}
glGetQueryObjecti64v_ = (PFNGLGETQUERYOBJECTI64VEXTPROC) getprocaddress("glGetQueryObjecti64v");
glGetQueryObjectui64v_ = (PFNGLGETQUERYOBJECTUI64VEXTPROC) getprocaddress("glGetQueryObjectui64v");
if(hasext("GL_EXT_texture_compression_s3tc"))
{
@ -880,97 +636,20 @@ void gl_checkextensions()
if(dbgexts) conoutf(CON_INIT, "Using GL_EXT_depth_bounds_test extension.");
}
if(glversion >= 320 || hasext("GL_ARB_depth_clamp"))
{
hasDC = true;
if(glversion < 320 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_depth_clamp extension.");
}
else if(hasext("GL_NV_depth_clamp"))
{
hasDC = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_NV_depth_clamp extension.");
}
glBindFragDataLocationIndexed_ = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)getprocaddress("glBindFragDataLocationIndexed");
if(glversion >= 330)
{
hasTSW = hasEAL = hasOQ2 = true;
}
else
{
if(hasext("GL_ARB_texture_swizzle") || hasext("GL_EXT_texture_swizzle"))
{
hasTSW = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_swizzle extension.");
}
if(hasext("GL_ARB_explicit_attrib_location"))
{
hasEAL = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_explicit_attrib_location extension.");
}
if(hasext("GL_ARB_occlusion_query2"))
{
hasOQ2 = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_occlusion_query2 extension.");
}
}
GLint dualbufs = 0;
glGetIntegerv(GL_MAX_DUAL_SOURCE_DRAW_BUFFERS, &dualbufs);
maxdualdrawbufs = dualbufs;
if(glversion >= 330 || hasext("GL_ARB_blend_func_extended"))
{
glBindFragDataLocationIndexed_ = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)getprocaddress("glBindFragDataLocationIndexed");
glMinSampleShading_ = (PFNGLMINSAMPLESHADINGPROC)getprocaddress("glMinSampleShading");
if(hasGPU4)
{
GLint dualbufs = 0;
glGetIntegerv(GL_MAX_DUAL_SOURCE_DRAW_BUFFERS, &dualbufs);
maxdualdrawbufs = dualbufs;
}
glBlendEquationi_ = (PFNGLBLENDEQUATIONIPROC) getprocaddress("glBlendEquationi");
glBlendEquationSeparatei_ = (PFNGLBLENDEQUATIONSEPARATEIPROC)getprocaddress("glBlendEquationSeparatei");
glBlendFunci_ = (PFNGLBLENDFUNCIPROC) getprocaddress("glBlendFunci");
glBlendFuncSeparatei_ = (PFNGLBLENDFUNCSEPARATEIPROC) getprocaddress("glBlendFuncSeparatei");
hasBFE = true;
if(glversion < 330 && dbgexts) conoutf(CON_INIT, "Using GL_ARB_blend_func_extended extension.");
}
if(glversion >= 400)
{
hasTG = hasGPU5 = true;
glMinSampleShading_ = (PFNGLMINSAMPLESHADINGPROC)getprocaddress("glMinSampleShading");
hasMSS = true;
glBlendEquationi_ = (PFNGLBLENDEQUATIONIPROC) getprocaddress("glBlendEquationi");
glBlendEquationSeparatei_ = (PFNGLBLENDEQUATIONSEPARATEIPROC)getprocaddress("glBlendEquationSeparatei");
glBlendFunci_ = (PFNGLBLENDFUNCIPROC) getprocaddress("glBlendFunci");
glBlendFuncSeparatei_ = (PFNGLBLENDFUNCSEPARATEIPROC) getprocaddress("glBlendFuncSeparatei");
hasDBB = true;
}
else
{
if(hasext("GL_ARB_texture_gather"))
{
hasTG = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_texture_gather extension.");
}
if(hasext("GL_ARB_gpu_shader5"))
{
hasGPU5 = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_gpu_shader5 extension.");
}
if(hasext("GL_ARB_sample_shading"))
{
glMinSampleShading_ = (PFNGLMINSAMPLESHADINGPROC)getprocaddress("glMinSampleShadingARB");
hasMSS = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_sample_shading extension.");
}
if(hasext("GL_ARB_draw_buffers_blend"))
{
glBlendEquationi_ = (PFNGLBLENDEQUATIONIPROC) getprocaddress("glBlendEquationiARB");
glBlendEquationSeparatei_ = (PFNGLBLENDEQUATIONSEPARATEIPROC)getprocaddress("glBlendEquationSeparateiARB");
glBlendFunci_ = (PFNGLBLENDFUNCIPROC) getprocaddress("glBlendFunciARB");
glBlendFuncSeparatei_ = (PFNGLBLENDFUNCSEPARATEIPROC) getprocaddress("glBlendFuncSeparateiARB");
hasDBB = true;
if(dbgexts) conoutf(CON_INIT, "Using GL_ARB_draw_buffers_blend extension.");
}
}
if(hasTG) usetexgather = hasGPU5 && !intel && !nvidia ? 2 : 1;
usetexgather = !intel && !nvidia ? 2 : 1;
if(glversion >= 430 || hasext("GL_ARB_ES3_compatibility"))
{
@ -1014,17 +693,11 @@ void gl_checkextensions()
if(dbgexts) conoutf(CON_INIT, "Using GL_NV_copy_image extension.");
}
extern int gdepthstencil, gstencil, glineardepth, msaadepthstencil, msaalineardepth, batchsunlight, smgather, rhrect, tqaaresolvegather;
extern int gdepthstencil, gstencil, glineardepth, msaadepthstencil, msaalineardepth, batchsunlight, smgather, rhrect;
if(amd)
{
msaalineardepth = glineardepth = 1; // reading back from depth-stencil still buggy on newer cards, and requires stencil for MSAA
msaadepthstencil = gdepthstencil = 1; // some older AMD GPUs do not support reading from depth-stencil textures, so only use depth-stencil renderbuffer for now
if(checkseries(renderer, "Radeon HD", 4000, 5199)) amd_pf_bug = 1;
if(glversion < 400)
{
amd_eal_bug = 1; // explicit_attrib_location broken when used with blend_func_extended on legacy Catalyst
rhrect = 1; // bad cpu stalls on Catalyst 13.x when trying to use 3D textures previously bound to FBOs
}
}
else if(nvidia)
{
@ -1049,12 +722,9 @@ void gl_checkextensions()
}
// sampling alpha by itself from a texture generates garbage on Intel drivers on Windows
intel_texalpha_bug = 1;
// MapBufferRange is buggy on older Intel drivers on Windows
if(glversion <= 310) intel_mapbufferrange_bug = 1;
}
}
if(mesa) mesa_swap_bug = 1;
if(hasGPU5 && hasTG) tqaaresolvegather = 1;
}
ICOMMAND(glext, "s", (char *ext), intret(hasext(ext) ? 1 : 0));
@ -1099,7 +769,7 @@ timer *findtimer(const char *name, bool gpu)
timer *begintimer(const char *name, bool gpu)
{
if(!usetimers || inbetweenframes || (gpu && (!hasTQ || deferquery))) return NULL;
if(!usetimers || inbetweenframes || (gpu && deferquery)) return NULL;
timer *t = findtimer(name, gpu);
if(t->gpu)
{

View File

@ -16,12 +16,10 @@ int aow = -1, aoh = -1;
GLuint aofbo[4] = { 0, 0, 0, 0 }, aotex[4] = { 0, 0, 0, 0 }, aonoisetex = 0;
matrix4 eyematrix, worldmatrix, linearworldmatrix, screenmatrix;
extern int amd_pf_bug;
int gethdrformat(int prec, int fallback = GL_RGB)
{
if(prec >= 3 && hasTF) return GL_RGB16F;
if(prec >= 2 && hasPF && !amd_pf_bug) return GL_R11F_G11F_B10F;
if(prec >= 3) return GL_RGB16F;
if(prec >= 2) return GL_R11F_G11F_B10F;
if(prec >= 1) return GL_RGB10;
return fallback;
}
@ -62,13 +60,13 @@ void setupbloom(int w, int h)
{
glGenBuffers_(1, &bloompbo);
glBindBuffer_(GL_PIXEL_PACK_BUFFER, bloompbo);
glBufferData_(GL_PIXEL_PACK_BUFFER, 4*(hasTF ? sizeof(GLfloat) : sizeof(GLushort))*(hasTRG ? 1 : 3), NULL, GL_DYNAMIC_COPY);
glBufferData_(GL_PIXEL_PACK_BUFFER, 4*sizeof(GLfloat), NULL, GL_DYNAMIC_COPY);
glBindBuffer_(GL_PIXEL_PACK_BUFFER, 0);
}
static const uchar gray[12] = { 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 };
static const float grayf[12] = { 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f, 0.125f };
createtexture(bloomtex[4], bloompbo ? 4 : 1, 1, hasTF ? (const void *)grayf : (const void *)gray, 3, 1, hasTF ? (hasTRG ? GL_R16F : GL_RGB16F) : (hasTRG ? GL_R16 : GL_RGB16));
createtexture(bloomtex[4], bloompbo ? 4 : 1, 1, (const void *)grayf, 3, 1, GL_R16F);
loopi(5 + (bloomformat != GL_RGB ? 1 : 0))
{
@ -184,7 +182,7 @@ void setupao(int w, int h)
delete[] noise;
bool upscale = aoreduce && aobilateral && aobilateralupscale;
GLenum format = aoprec && hasTRG ? GL_R8 : GL_RGBA8,
GLenum format = aoprec && GL_R8,
packformat = aobilateral && aopackdepth ? (aodepthformat ? GL_RG16F : GL_RGBA8) : format;
int packfilter = upscale && aopackdepth && !aodepthformat ? 0 : 1;
loopi(upscale ? 3 : 2)
@ -258,7 +256,7 @@ VAR(debugao, 0, 0, 1);
void initao()
{
aodepthformat = aofloatdepth && hasTRG && hasTF ? aofloatdepth : 0;
aodepthformat = aofloatdepth;
}
void viewao()
@ -484,16 +482,13 @@ void initgbuffer()
msaamaxsamples = msaamaxdepthtexsamples = msaamaxcolortexsamples = msaaminsamples = msaasamples = msaalight = 0;
msaapositions.setsize(0);
if(hasFBMS && hasFBB && hasTMS)
{
GLint val;
glGetIntegerv(GL_MAX_SAMPLES, &val);
msaamaxsamples = val;
glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &val);
msaamaxdepthtexsamples = val;
glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &val);
msaamaxcolortexsamples = val;
}
GLint val;
glGetIntegerv(GL_MAX_SAMPLES, &val);
msaamaxsamples = val;
glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &val);
msaamaxdepthtexsamples = val;
glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &val);
msaamaxcolortexsamples = val;
int maxsamples = min(msaamaxsamples, msaamaxcolortexsamples), reqsamples = min(msaa, maxsamples);
if(reqsamples >= 2)
@ -513,18 +508,17 @@ void initgbuffer()
else if(msaalineardepth >= 0) lineardepth = msaalineardepth;
}
if(lineardepth > 1 && (!hasAFBO || !hasTF || !hasTRG)) gdepthformat = 1;
else gdepthformat = lineardepth;
gdepthformat = lineardepth;
if(msaaminsamples)
{
ghasstencil = (msaadepthstencil > 1 || (msaadepthstencil && gdepthformat)) && hasDS ? 2 : (msaastencil ? 1 : 0);
ghasstencil = (msaadepthstencil > 1 || (msaadepthstencil && gdepthformat)) ? 2 : (msaastencil ? 1 : 0);
checkmsaasamples();
if(msaapreserve >= 0) msaalight = hasMSS ? 3 : (msaasamples==2 ? 2 : msaapreserve);
if(msaapreserve >= 0) msaalight = 3;
}
else ghasstencil = (gdepthstencil > 1 || (gdepthstencil && gdepthformat)) && hasDS ? 2 : (gstencil ? 1 : 0);
else ghasstencil = (gdepthstencil > 1 || (gdepthstencil && gdepthformat)) ? 2 : (gstencil ? 1 : 0);
initao();
}
@ -623,7 +617,7 @@ void setupmsbuffer(int w, int h)
{
if(!msglowtex) glGenTextures(1, &msglowtex);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msglowtex);
glTexImage2DMultisample_(GL_TEXTURE_2D_MULTISAMPLE, msaasamples, hasAFBO ? hdrformat : GL_RGBA8, w, h, GL_TRUE);
glTexImage2DMultisample_(GL_TEXTURE_2D_MULTISAMPLE, msaasamples, hdrformat, w, h, GL_TRUE);
}
bindmsdepth();
@ -634,7 +628,7 @@ void setupmsbuffer(int w, int h)
if(glCheckFramebufferStatus_(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
if(msaalight && hasAFBO)
if(msaalight)
{
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msglowtex);
glTexImage2DMultisample_(GL_TEXTURE_2D_MULTISAMPLE, msaasamples, GL_RGBA8, w, h, GL_TRUE);
@ -794,7 +788,7 @@ void setupgbuffer()
createtexture(gcolortex, gw, gh, NULL, 3, 0, GL_RGBA8, GL_TEXTURE_RECTANGLE);
createtexture(gnormaltex, gw, gh, NULL, 3, 0, GL_RGBA8, GL_TEXTURE_RECTANGLE);
createtexture(gglowtex, gw, gh, NULL, 3, 0, hasAFBO ? hdrformat : GL_RGBA8, GL_TEXTURE_RECTANGLE);
createtexture(gglowtex, gw, gh, NULL, 3, 0, hdrformat, GL_TEXTURE_RECTANGLE);
bindgdepth();
glFramebufferTexture2D_(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, gcolortex, 0);
@ -804,14 +798,10 @@ void setupgbuffer()
if(glCheckFramebufferStatus_(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
if(hasAFBO)
{
createtexture(gglowtex, gw, gh, NULL, 3, 0, GL_RGBA8, GL_TEXTURE_RECTANGLE);
glFramebufferTexture2D_(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_RECTANGLE, gglowtex, 0);
if(glCheckFramebufferStatus_(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
fatal("failed allocating g-buffer!");
}
else fatal("failed allocating g-buffer!");
createtexture(gglowtex, gw, gh, NULL, 3, 0, GL_RGBA8, GL_TEXTURE_RECTANGLE);
glFramebufferTexture2D_(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_RECTANGLE, gglowtex, 0);
if(glCheckFramebufferStatus_(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
fatal("failed allocating g-buffer!");
}
glClearColor(0, 0, 0, 0);
@ -1145,7 +1135,7 @@ void processhdr(GLuint outfbo, int aa)
{
glBindBuffer_(GL_PIXEL_PACK_BUFFER, bloompbo);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(0, 0, 4, 1, hasTRG ? GL_RED : GL_RGB, hasTF ? GL_FLOAT : GL_UNSIGNED_SHORT, NULL);
glReadPixels(0, 0, 4, 1, GL_RED, GL_FLOAT, NULL);
glBindBuffer_(GL_PIXEL_PACK_BUFFER, 0);
}
@ -1156,7 +1146,7 @@ void processhdr(GLuint outfbo, int aa)
{
gle::bindvbo(bloompbo);
gle::enablecolor();
gle::colorpointer(hasTF ? sizeof(GLfloat) : sizeof(GLushort), (const void *)0, hasTF ? GL_FLOAT : GL_UNSIGNED_SHORT, 1);
gle::colorpointer(sizeof(GLfloat), (const void *)0, GL_FLOAT, 1);
gle::clearvbo();
}
@ -1389,7 +1379,7 @@ void clearrhshaders()
void setupradiancehints()
{
GLenum rhformat = hasTF && rhprec >= 1 ? GL_RGBA16F : GL_RGBA8;
GLenum rhformat = rhprec >= 1 ? GL_RGBA16F : GL_RGBA8;
loopi(!rhrect && rhcache ? 8 : 4)
{
@ -1714,8 +1704,8 @@ static inline void setsmcomparemode() // use embedded shadow cmp
}
extern int usetexgather;
static inline bool usegatherforsm() { return smfilter > 1 && smgather && hasTG && usetexgather; }
static inline bool usesmcomparemode() { return !usegatherforsm() || (hasTG && hasGPU5 && usetexgather > 1); }
static inline bool usegatherforsm() { return smfilter > 1 && smgather && usetexgather; }
static inline bool usesmcomparemode() { return !usegatherforsm() || (usetexgather > 1); }
void viewshadowatlas()
{

View File

@ -345,7 +345,7 @@ VAR(oqwait, 0, 1, 1);
static inline GLenum querytarget()
{
return oqany && hasOQ2 ? (oqany > 1 && hasES3 ? GL_ANY_SAMPLES_PASSED_CONSERVATIVE : GL_ANY_SAMPLES_PASSED) : GL_SAMPLES_PASSED;
return oqany ? (oqany > 1 && hasES3 ? GL_ANY_SAMPLES_PASSED_CONSERVATIVE : GL_ANY_SAMPLES_PASSED) : GL_SAMPLES_PASSED;
}
void startquery(occludequery *query)

View File

@ -148,141 +148,44 @@ static const char *finddecls(const char *line)
}
}
extern int amd_eal_bug;
static void compileglslshader(Shader &s, GLenum type, GLuint &obj, const char *def, const char *name, bool msg = true)
{
const char *source = def + strspn(def, " \t\r\n");
char *modsource = NULL;
const char *parts[16];
int numparts = 0;
static const struct { int version; const char * const header; } glslversions[] =
parts[numparts++] = "#version 400\n";
if(type == GL_VERTEX_SHADER) parts[numparts++] =
"#define attribute in\n"
"#define varying out\n";
else if(type == GL_FRAGMENT_SHADER)
{
{ 400, "#version 400\n" },
{ 330, "#version 330\n" },
{ 150, "#version 150\n" },
{ 140, "#version 140\n" },
{ 130, "#version 130\n" },
{ 120, "#version 120\n" }
};
loopi(sizeof(glslversions)/sizeof(glslversions[0])) if(glslversion >= glslversions[i].version)
{
parts[numparts++] = glslversions[i].header;
break;
}
if(glslversion < 140)
{
parts[numparts++] = "#extension GL_ARB_texture_rectangle : enable\n";
if(hasEGPU4)
parts[numparts++] = "#extension GL_EXT_gpu_shader4 : enable\n";
}
if(glslversion < 150 && hasTMS)
parts[numparts++] = "#extension GL_ARB_texture_multisample : enable\n";
if(glslversion >= 150 && glslversion < 330 && hasEAL && !amd_eal_bug)
parts[numparts++] = "#extension GL_ARB_explicit_attrib_location : enable\n";
if(glslversion < 400)
{
if(hasTG) parts[numparts++] = "#extension GL_ARB_texture_gather : enable\n";
if(hasGPU5) parts[numparts++] = "#extension GL_ARB_gpu_shader5 : enable\n";
}
if(glslversion >= 130)
{
if(type == GL_VERTEX_SHADER) parts[numparts++] =
"#define attribute in\n"
"#define varying out\n";
else if(type == GL_FRAGMENT_SHADER)
{
parts[numparts++] = "#define varying in\n";
parts[numparts++] = (glslversion >= 330 || (glslversion >= 150 && hasEAL)) && !amd_eal_bug ?
"#define fragdata(loc) layout(location = loc) out\n"
"#define fragblend(loc) layout(location = loc, index = 1) out\n" :
"#define fragdata(loc) out\n"
"#define fragblend(loc) out\n";
if(glslversion < 150)
{
const char *decls = finddecls(source);
if(decls)
{
static const char * const prec = "precision highp float;\n";
if(decls != source)
{
static const int preclen = strlen(prec);
int beforelen = int(decls-source), afterlen = strlen(decls);
modsource = newstring(beforelen + preclen + afterlen);
memcpy(modsource, source, beforelen);
memcpy(&modsource[beforelen], prec, preclen);
memcpy(&modsource[beforelen + preclen], decls, afterlen);
modsource[beforelen + preclen + afterlen] = '\0';
}
else parts[numparts++] = prec;
}
}
}
parts[numparts++] = "#define varying in\n";
parts[numparts++] =
"#define texture1D(sampler, coords) texture(sampler, coords)\n"
"#define texture2D(sampler, coords) texture(sampler, coords)\n"
"#define texture2DOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n"
"#define texture2DProj(sampler, coords) textureProj(sampler, coords)\n"
"#define shadow2D(sampler, coords) texture(sampler, coords)\n"
"#define shadow2DOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n"
"#define texture3D(sampler, coords) texture(sampler, coords)\n"
"#define textureCube(sampler, coords) texture(sampler, coords)\n";
if(glslversion >= 140)
{
parts[numparts++] =
"#define texture2DRect(sampler, coords) texture(sampler, coords)\n"
"#define texture2DRectProj(sampler, coords) textureProj(sampler, coords)\n"
"#define shadow2DRect(sampler, coords) texture(sampler, coords)\n";
extern int mesa_texrectoffset_bug;
parts[numparts++] = mesa_texrectoffset_bug ?
"#define texture2DRectOffset(sampler, coords, offset) texture(sampler, coords + vec2(offset))\n"
"#define shadow2DRectOffset(sampler, coords, offset) texture(sampler, coords + vec2(offset))\n" :
"#define texture2DRectOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n"
"#define shadow2DRectOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n";
}
}
if(glslversion < 130 && hasEGPU4) parts[numparts++] = "#define uint unsigned int\n";
else if(glslversion < 140 && !hasEGPU4)
{
if(glslversion < 130) parts[numparts++] = "#define flat\n";
parts[numparts++] =
"#define texture2DRectOffset(sampler, coords, offset) texture2DRect(sampler, coords + vec2(offset))\n"
"#define shadow2DRectOffset(sampler, coords, offset) shadow2DRect(sampler, coords + vec2(offset))\n";
}
if(glslversion < 130 && type == GL_FRAGMENT_SHADER)
{
if(hasEGPU4)
{
parts[numparts++] =
"#define fragdata(loc) varying out\n"
"#define fragblend(loc) varying out\n";
}
else
{
loopv(s.fragdatalocs)
{
FragDataLoc &d = s.fragdatalocs[i];
if(d.index) continue;
if(i >= 4) break;
static string defs[4];
const char *swizzle = "";
switch(d.format)
{
case GL_UNSIGNED_INT_VEC2:
case GL_INT_VEC2:
case GL_FLOAT_VEC2: swizzle = ".rg"; break;
case GL_UNSIGNED_INT_VEC3:
case GL_INT_VEC3:
case GL_FLOAT_VEC3: swizzle = ".rgb"; break;
case GL_UNSIGNED_INT:
case GL_INT:
case GL_FLOAT: swizzle = ".r"; break;
}
formatstring(defs[i], "#define %s gl_FragData[%d]%s\n", d.name, d.loc, swizzle);
parts[numparts++] = defs[i];
}
}
"#define fragdata(loc) layout(location = loc) out\n"
"#define fragblend(loc) layout(location = loc, index = 1) out\n";
}
parts[numparts++] =
"#define texture1D(sampler, coords) texture(sampler, coords)\n"
"#define texture2D(sampler, coords) texture(sampler, coords)\n"
"#define texture2DOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n"
"#define texture2DProj(sampler, coords) textureProj(sampler, coords)\n"
"#define shadow2D(sampler, coords) texture(sampler, coords)\n"
"#define shadow2DOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n"
"#define texture3D(sampler, coords) texture(sampler, coords)\n"
"#define textureCube(sampler, coords) texture(sampler, coords)\n";
parts[numparts++] =
"#define texture2DRect(sampler, coords) texture(sampler, coords)\n"
"#define texture2DRectProj(sampler, coords) textureProj(sampler, coords)\n"
"#define shadow2DRect(sampler, coords) texture(sampler, coords)\n";
extern int mesa_texrectoffset_bug;
parts[numparts++] = mesa_texrectoffset_bug ?
"#define texture2DRectOffset(sampler, coords, offset) texture(sampler, coords + vec2(offset))\n"
"#define shadow2DRectOffset(sampler, coords, offset) texture(sampler, coords + vec2(offset))\n" :
"#define texture2DRectOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n"
"#define shadow2DRectOffset(sampler, coords, offset) textureOffset(sampler, coords, offset)\n";
parts[numparts++] = modsource ? modsource : source;
obj = glCreateShader_(type);
@ -306,7 +209,7 @@ VAR(dbgubo, 0, 0, 1);
static void bindglsluniform(Shader &s, UniformLoc &u)
{
u.loc = glGetUniformLocation_(s.program, u.name);
if(!u.blockname || !hasUBO) return;
if(!u.blockname) return;
GLuint bidx = glGetUniformBlockIndex_(s.program, u.blockname);
GLuint uidx = GL_INVALID_INDEX;
glGetUniformIndices_(s.program, 1, &u.name, &uidx);
@ -362,15 +265,6 @@ static void linkglslprogram(Shader &s, bool msg = true)
attribs |= 1<<a.loc;
}
loopi(gle::MAXATTRIBS) if(!(attribs&(1<<i))) glBindAttribLocation_(s.program, i, gle::attribnames[i]);
if(hasGPU4 && ((glslversion < 330 && (glslversion < 150 || !hasEAL)) || amd_eal_bug)) loopv(s.fragdatalocs)
{
FragDataLoc &d = s.fragdatalocs[i];
if(d.index)
{
if(maxdualdrawbufs) glBindFragDataLocationIndexed_(s.program, d.loc, d.index, d.name);
}
else glBindFragDataLocation_(s.program, d.loc, d.name);
}
glLinkProgram_(s.program);
glGetProgramiv_(s.program, GL_LINK_STATUS, &success);
}
@ -400,71 +294,6 @@ static void linkglslprogram(Shader &s, bool msg = true)
}
}
static void findfragdatalocs(Shader &s, char *ps, const char *macroname, int index)
{
int macrolen = strlen(macroname);
bool clear = glslversion < 130 && !hasEGPU4;
while((ps = strstr(ps, macroname)))
{
char *start = ps;
int loc = strtol(ps + macrolen, (char **)&ps, 0);
if(loc < 0 || loc > 3) continue;
ps += strspn(ps, ") \t\r\n");
const char *type = ps;
ps += strcspn(ps, "; \t\r\n");
GLenum format = GL_FLOAT_VEC4;
switch(type[0])
{
case 'v':
if(matchstring(type, ps-type, "vec3")) format = GL_FLOAT_VEC3;
else if(matchstring(type, ps-type, "vec2")) format = GL_FLOAT_VEC2;
break;
case 'f':
if(matchstring(type, ps-type, "float")) format = GL_FLOAT;
break;
case 'i':
if(matchstring(type, ps-type, "ivec4")) format = GL_INT_VEC4;
else if(matchstring(type, ps-type, "ivec3")) format = GL_INT_VEC3;
else if(matchstring(type, ps-type, "ivec2")) format = GL_INT_VEC2;
else if(matchstring(type, ps-type, "int")) format = GL_INT;
break;
case 'u':
if(matchstring(type, ps-type, "uvec4")) format = GL_UNSIGNED_INT_VEC4;
else if(matchstring(type, ps-type, "uvec3")) format = GL_UNSIGNED_INT_VEC3;
else if(matchstring(type, ps-type, "uvec2")) format = GL_UNSIGNED_INT_VEC2;
else if(matchstring(type, ps-type, "uint")) format = GL_UNSIGNED_INT;
break;
}
ps += strspn(ps, " \t\r\n");
const char *name = ps;
ps += strcspn(ps, "; \t\r\n");
if(ps > name)
{
char end = *ps;
*ps = '\0';
s.fragdatalocs.add(FragDataLoc(getshaderparamname(name), loc, format, index));
*ps = end;
}
if(clear)
{
ps += strspn(ps, "; \t\r\n");
memset(start, ' ', ps - start);
}
}
}
void findfragdatalocs(Shader &s, char *psstr)
{
if(!psstr || ((glslversion >= 330 || (glslversion >= 150 && hasEAL)) && !amd_eal_bug)) return;
findfragdatalocs(s, psstr, "fragdata(", 0);
if(maxdualdrawbufs) findfragdatalocs(s, psstr, "fragblend(", 1);
}
int getlocalparam(const char *name)
{
return localparams.access(name, int(localparams.numelems));
@ -819,7 +648,6 @@ Shader *newshader(int type, const char *name, const char *vs, const char *ps, Sh
genuniformlocs(s, vs, ps, s.reusevs, s.reuseps);
s.fragdatalocs.setsize(0);
if(s.reuseps) s.fragdatalocs = s.reuseps->fragdatalocs;
else findfragdatalocs(s, s.psstr);
if(!s.compile())
{
s.cleanup(true);
@ -978,20 +806,14 @@ void setupshaders()
maxvsuniforms = val/4;
glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &val);
maxfsuniforms = val/4;
if(hasGPU4)
{
glGetIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &val);
mintexoffset = val;
glGetIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &val);
maxtexoffset = val;
}
else mintexoffset = maxtexoffset = 0;
if(glslversion >= 140 || hasEGPU4)
{
mintexrectoffset = mintexoffset;
maxtexrectoffset = maxtexoffset;
}
else mintexrectoffset = maxtexrectoffset = 0;
glGetIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, &val);
mintexoffset = val;
glGetIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, &val);
maxtexoffset = val;
mintexrectoffset = mintexoffset;
maxtexrectoffset = maxtexoffset;
standardshaders = true;
nullshader = newshader(0, "<init>null",

View File

@ -706,9 +706,9 @@ GLenum compressedformat(GLenum format, int w, int h, int force = 0)
case GL_RGB5_A1: return usetexcompress > 1 ? GL_COMPRESSED_RGBA_S3TC_DXT1_EXT : GL_COMPRESSED_RGBA;
case GL_RGBA: return usetexcompress > 1 ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGBA;
case GL_RED:
case GL_R8: return hasRGTC ? (usetexcompress > 1 ? GL_COMPRESSED_RED_RGTC1 : GL_COMPRESSED_RED) : (usetexcompress > 1 ? GL_COMPRESSED_RGB_S3TC_DXT1_EXT : GL_COMPRESSED_RGB);
case GL_R8: return(usetexcompress > 1 ? GL_COMPRESSED_RED_RGTC1 : GL_COMPRESSED_RED);
case GL_RG:
case GL_RG8: return hasRGTC ? (usetexcompress > 1 ? GL_COMPRESSED_RG_RGTC2 : GL_COMPRESSED_RG) : (usetexcompress > 1 ? GL_COMPRESSED_RGBA_S3TC_DXT5_EXT : GL_COMPRESSED_RGBA);
case GL_RG8: return (usetexcompress > 1 ? GL_COMPRESSED_RG_RGTC2 : GL_COMPRESSED_RG);
case GL_LUMINANCE:
case GL_LUMINANCE8: return hasLATC ? (usetexcompress > 1 ? GL_COMPRESSED_LUMINANCE_LATC1_EXT : GL_COMPRESSED_LUMINANCE) : (usetexcompress > 1 ? GL_COMPRESSED_RGB_S3TC_DXT1_EXT : GL_COMPRESSED_RGB);
case GL_LUMINANCE_ALPHA:
@ -903,7 +903,7 @@ void setuptexparameters(int tnum, const void *pixels, int clamp, int filter, GLe
(bilinear ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_LINEAR) :
(bilinear ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST)) :
(filter && bilinear ? GL_LINEAR : GL_NEAREST));
if(swizzle && hasTRG && hasTSW)
if(swizzle)
{
const GLint *mask = swizzlemask(format);
if(mask) glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, mask);
@ -1085,8 +1085,8 @@ static GLenum texformat(int bpp, bool swizzle = false)
{
switch(bpp)
{
case 1: return hasTRG && (hasTSW || !glcompat || !swizzle) ? GL_RED : GL_LUMINANCE;
case 2: return hasTRG && (hasTSW || !glcompat || !swizzle) ? GL_RG : GL_LUMINANCE_ALPHA;
case 1: return GL_RED;
case 2: return GL_RG;
case 3: return GL_RGB;
case 4: return GL_RGBA;
default: return 0;
@ -1167,12 +1167,6 @@ static Texture *newtexture(Texture *t, const char *rname, ImageData &s, int clam
{
format = texformat(s.bpp, swizzle);
t->bpp = s.bpp;
if(swizzle && hasTRG && !hasTSW && swizzlemask(format))
{
swizzleimage(s);
format = texformat(s.bpp, swizzle);
t->bpp = s.bpp;
}
}
if(alphaformat(format)) t->type |= Texture::ALPHA;
t->w = t->xs = s.w;
@ -2813,12 +2807,6 @@ Texture *cubemaploadwildcard(Texture *t, const char *name, bool mipit, bool msg,
{
format = texformat(surface[0].bpp, true);
t->bpp = surface[0].bpp;
if(hasTRG && !hasTSW && swizzlemask(format))
{
loopi(6) swizzleimage(surface[i]);
format = texformat(surface[0].bpp, true);
t->bpp = surface[0].bpp;
}
}
if(alphaformat(format)) t->type |= Texture::ALPHA;
t->mipmap = mipit;
@ -2975,35 +2963,18 @@ GLuint genenvmap(const vec &o, int envmapsize, int blur, bool onlysky)
}
for(int level = 0, lsize = texsize;; level++)
{
if(hasFBB)
{
glBindFramebuffer_(GL_READ_FRAMEBUFFER, emfbo[0]);
glBindFramebuffer_(GL_DRAW_FRAMEBUFFER, emfbo[2]);
glFramebufferTexture2D_(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, side.target, tex, level);
glBlitFramebuffer_(0, 0, lsize, lsize, 0, 0, lsize, lsize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
}
else
{
glBindFramebuffer_(GL_FRAMEBUFFER, emfbo[0]);
glBindTexture(GL_TEXTURE_CUBE_MAP, tex);
glCopyTexSubImage2D(side.target, level, 0, 0, 0, 0, lsize, lsize);
}
glBindFramebuffer_(GL_READ_FRAMEBUFFER, emfbo[0]);
glBindFramebuffer_(GL_DRAW_FRAMEBUFFER, emfbo[2]);
glFramebufferTexture2D_(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, side.target, tex, level);
glBlitFramebuffer_(0, 0, lsize, lsize, 0, 0, lsize, lsize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
if(lsize <= 1) break;
int dsize = lsize/2;
if(hasFBB)
{
glBindFramebuffer_(GL_READ_FRAMEBUFFER, emfbo[0]);
glBindFramebuffer_(GL_DRAW_FRAMEBUFFER, emfbo[1]);
glBlitFramebuffer_(0, 0, lsize, lsize, 0, 0, dsize, dsize, GL_COLOR_BUFFER_BIT, GL_LINEAR);
}
else
{
glBindFramebuffer_(GL_FRAMEBUFFER, emfbo[1]);
glBindTexture(GL_TEXTURE_RECTANGLE, emtex[0]);
glViewport(0, 0, dsize, dsize);
SETSHADER(scalelinear);
screenquad(lsize, lsize);
}
glBindFramebuffer_(GL_READ_FRAMEBUFFER, emfbo[0]);
glBindFramebuffer_(GL_DRAW_FRAMEBUFFER, emfbo[1]);
glBlitFramebuffer_(0, 0, lsize, lsize, 0, 0, dsize, dsize, GL_COLOR_BUFFER_BIT, GL_LINEAR);
lsize = dsize;
swap(emfbo[0], emfbo[1]);
swap(emtex[0], emtex[1]);
@ -3406,12 +3377,12 @@ bool loaddds(const char *filename, ImageData &image, int force)
if((supported = hasS3TC) || force) format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
break;
case FOURCC_ATI1:
if((supported = hasRGTC) || force) format = GL_COMPRESSED_RED_RGTC1;
else if((supported = hasLATC)) format = GL_COMPRESSED_LUMINANCE_LATC1_EXT;
supported = true;
format = GL_COMPRESSED_RED_RGTC1;
break;
case FOURCC_ATI2:
if((supported = hasRGTC) || force) format = GL_COMPRESSED_RG_RGTC2;
else if((supported = hasLATC)) format = GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT;
supported = true;
format = GL_COMPRESSED_RG_RGTC2;
break;
}
}

View File

@ -1,8 +1,5 @@
#include "cube.h"
extern int glversion;
extern int intel_mapbufferrange_bug;
namespace gle
{
struct attribinfo
@ -48,8 +45,6 @@ namespace gle
{
quadsenabled = true;
if(glversion < 300) return;
if(quadindexes)
{
glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, quadindexes);
@ -76,19 +71,12 @@ namespace gle
{
quadsenabled = false;
if(glversion < 300) return;
glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void drawquads(int offset, int count)
{
if(count <= 0) return;
if(glversion < 300)
{
glDrawArrays(GL_QUADS, offset*4, count*4);
return;
}
if(offset + count > MAXQUADS)
{
if(offset >= MAXQUADS) return;
@ -216,21 +204,18 @@ namespace gle
void begin(GLenum mode, int numverts)
{
primtype = mode;
if(glversion >= 300 && !intel_mapbufferrange_bug)
int len = numverts * vertexsize;
if(vbooffset + len >= MAXVBOSIZE)
{
int len = numverts * vertexsize;
if(vbooffset + len >= MAXVBOSIZE)
{
len = min(len, MAXVBOSIZE);
if(!vbo) glGenBuffers_(1, &vbo);
glBindBuffer_(GL_ARRAY_BUFFER, vbo);
glBufferData_(GL_ARRAY_BUFFER, MAXVBOSIZE, NULL, GL_STREAM_DRAW);
vbooffset = 0;
}
else if(!lastvertexsize) glBindBuffer_(GL_ARRAY_BUFFER, vbo);
void *buf = glMapBufferRange_(GL_ARRAY_BUFFER, vbooffset, len, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_RANGE_BIT|GL_MAP_UNSYNCHRONIZED_BIT);
if(buf) attribbuf.reset((uchar *)buf, len);
len = min(len, MAXVBOSIZE);
if(!vbo) glGenBuffers_(1, &vbo);
glBindBuffer_(GL_ARRAY_BUFFER, vbo);
glBufferData_(GL_ARRAY_BUFFER, MAXVBOSIZE, NULL, GL_STREAM_DRAW);
vbooffset = 0;
}
else if(!lastvertexsize) glBindBuffer_(GL_ARRAY_BUFFER, vbo);
void *buf = glMapBufferRange_(GL_ARRAY_BUFFER, vbooffset, len, GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_RANGE_BIT|GL_MAP_UNSYNCHRONIZED_BIT);
if(buf) attribbuf.reset((uchar *)buf, len);
}
void multidraw()
@ -257,38 +242,36 @@ namespace gle
return 0;
}
int start = 0;
if(glversion >= 300)
if(buf == attribdata)
{
if(buf == attribdata)
if(vbooffset + attribbuf.length() >= MAXVBOSIZE)
{
if(vbooffset + attribbuf.length() >= MAXVBOSIZE)
{
if(!vbo) glGenBuffers_(1, &vbo);
glBindBuffer_(GL_ARRAY_BUFFER, vbo);
glBufferData_(GL_ARRAY_BUFFER, MAXVBOSIZE, NULL, GL_STREAM_DRAW);
vbooffset = 0;
}
else if(!lastvertexsize) glBindBuffer_(GL_ARRAY_BUFFER, vbo);
void *dst = intel_mapbufferrange_bug ? NULL :
glMapBufferRange_(GL_ARRAY_BUFFER, vbooffset, attribbuf.length(), GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_RANGE_BIT|GL_MAP_UNSYNCHRONIZED_BIT);
if(dst)
{
memcpy(dst, attribbuf.getbuf(), attribbuf.length());
glUnmapBuffer_(GL_ARRAY_BUFFER);
}
else glBufferSubData_(GL_ARRAY_BUFFER, vbooffset, attribbuf.length(), attribbuf.getbuf());
if(!vbo) glGenBuffers_(1, &vbo);
glBindBuffer_(GL_ARRAY_BUFFER, vbo);
glBufferData_(GL_ARRAY_BUFFER, MAXVBOSIZE, NULL, GL_STREAM_DRAW);
vbooffset = 0;
}
else glUnmapBuffer_(GL_ARRAY_BUFFER);
buf = (uchar *)0 + vbooffset;
if(vertexsize == lastvertexsize && buf >= lastbuf)
else if(!lastvertexsize) glBindBuffer_(GL_ARRAY_BUFFER, vbo);
void *dst = glMapBufferRange_(GL_ARRAY_BUFFER, vbooffset, attribbuf.length(), GL_MAP_WRITE_BIT|GL_MAP_INVALIDATE_RANGE_BIT|GL_MAP_UNSYNCHRONIZED_BIT);
if(dst)
{
start = int(buf - lastbuf)/vertexsize;
if(primtype == GL_QUADS && (start%4 || start + attribbuf.length()/vertexsize >= 4*MAXQUADS))
start = 0;
else buf = lastbuf;
memcpy(dst, attribbuf.getbuf(), attribbuf.length());
glUnmapBuffer_(GL_ARRAY_BUFFER);
}
vbooffset += attribbuf.length();
else glBufferSubData_(GL_ARRAY_BUFFER, vbooffset, attribbuf.length(), attribbuf.getbuf());
}
else glUnmapBuffer_(GL_ARRAY_BUFFER);
buf = (uchar *)0 + vbooffset;
if(vertexsize == lastvertexsize && buf >= lastbuf)
{
start = int(buf - lastbuf)/vertexsize;
if(primtype == GL_QUADS && (start%4 || start + attribbuf.length()/vertexsize >= 4*MAXQUADS))
start = 0;
else buf = lastbuf;
}
vbooffset += attribbuf.length();
setattribs(buf);
int numvertexes = attribbuf.length()/vertexsize;
if(primtype == GL_QUADS)
@ -318,16 +301,14 @@ namespace gle
numlastattribs = lastattribmask = lastvertexsize = 0;
lastbuf = NULL;
if(quadsenabled) disablequads();
if(glversion >= 300) glBindBuffer_(GL_ARRAY_BUFFER, 0);
glBindBuffer_(GL_ARRAY_BUFFER, 0);
}
void setup()
{
if(glversion >= 300)
{
if(!defaultvao) glGenVertexArrays_(1, &defaultvao);
glBindVertexArray_(defaultvao);
}
if(!defaultvao) glGenVertexArrays_(1, &defaultvao);
glBindVertexArray_(defaultvao);
attribdata = new uchar[MAXVBOSIZE];
attribbuf.reset(attribdata, MAXVBOSIZE);
}