Line endings.

This commit is contained in:
Andrei Drexler 2011-03-14 16:45:56 +00:00
parent 65853bf81c
commit dffc983550

View file

@ -1,9 +1,9 @@
#include "tr_local.h" #include "tr_local.h"
#ifndef ARRAY_SIZE #ifndef ARRAY_SIZE
# define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) # define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
#endif #endif
typedef struct fboRenderBuffer_s { typedef struct fboRenderBuffer_s {
GLuint id; GLuint id;
int internalFormat; int internalFormat;
@ -25,91 +25,91 @@ typedef struct fbo_s {
char name[MAX_QPATH]; char name[MAX_QPATH];
} fbo_t; } fbo_t;
void R_FBO_InitRenderBuffer(fboRenderBuffer_t* buf) void R_FBO_InitRenderBuffer(fboRenderBuffer_t* buf)
{ {
buf->id = 0; buf->id = 0;
qglGenRenderbuffersEXT(1, &buf->id); qglGenRenderbuffersEXT(1, &buf->id);
qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, buf->id); qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, buf->id);
qglRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, buf->internalFormat, buf->width, buf->height); qglRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, buf->internalFormat, buf->width, buf->height);
qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
} }
void R_FBO_ReleaseRenderBuffer(fboRenderBuffer_t* buf) void R_FBO_ReleaseRenderBuffer(fboRenderBuffer_t* buf)
{ {
if (buf->id == 0) if (buf->id == 0)
return; return;
qglDeleteRenderbuffersEXT(1, &buf->id); qglDeleteRenderbuffersEXT(1, &buf->id);
buf->id = 0; buf->id = 0;
} }
fboRenderBuffer_t* R_FBO_CreateRenderBuffer(int width, int height, int pixelformat) fboRenderBuffer_t* R_FBO_CreateRenderBuffer(int width, int height, int pixelformat)
{ {
fboRenderBuffer_t* ret = NULL; fboRenderBuffer_t* ret = NULL;
if (tr.fbo.numRenderBuffers >= ARRAY_SIZE(tr.fbo.renderBuffers)) if (tr.fbo.numRenderBuffers >= ARRAY_SIZE(tr.fbo.renderBuffers))
{ {
ri.Error(ERR_FATAL, "Too many FBO render buffers\n"); ri.Error(ERR_FATAL, "Too many FBO render buffers\n");
return NULL; return NULL;
} }
ret = ri.Hunk_Alloc(sizeof(*ret), h_low); ret = ri.Hunk_Alloc(sizeof(*ret), h_low);
memset(ret, 0, sizeof(*ret)); memset(ret, 0, sizeof(*ret));
ret->width = width; ret->width = width;
ret->height = height; ret->height = height;
ret->internalFormat = pixelformat; ret->internalFormat = pixelformat;
R_FBO_InitRenderBuffer(ret); R_FBO_InitRenderBuffer(ret);
tr.fbo.renderBuffers[tr.fbo.numRenderBuffers++] = ret; tr.fbo.renderBuffers[tr.fbo.numRenderBuffers++] = ret;
return ret; return ret;
} }
fboZBuffer_t* R_FBO_CreateZBuffer(int width, int height) fboZBuffer_t* R_FBO_CreateZBuffer(int width, int height)
{ {
return R_FBO_CreateRenderBuffer(width, height, GL_DEPTH_COMPONENT24); return R_FBO_CreateRenderBuffer(width, height, GL_DEPTH_COMPONENT24);
} }
void R_FBO_Init(fbo_t* fbo) void R_FBO_Init(fbo_t* fbo)
{ {
memset(fbo, 0, sizeof(*fbo)); memset(fbo, 0, sizeof(*fbo));
qglGenFramebuffersEXT(1, &fbo->id); qglGenFramebuffersEXT(1, &fbo->id);
} }
void R_FBO_Release(fbo_t* fbo) void R_FBO_Release(fbo_t* fbo)
{ {
if (fbo->id == 0) if (fbo->id == 0)
return; return;
qglDeleteFramebuffersEXT(1, &fbo->id); qglDeleteFramebuffersEXT(1, &fbo->id);
fbo->id = 0; fbo->id = 0;
} }
void R_FBO_AddColorBuffer(fbo_t* fbo, image_t* image) void R_FBO_AddColorBuffer(fbo_t* fbo, image_t* image)
{ {
if (fbo->numColorBufs >= ARRAY_SIZE(fbo->color)) if (fbo->numColorBufs >= ARRAY_SIZE(fbo->color))
{ {
ri.Error(ERR_FATAL, "Max FBO color buffers exceeded.\n"); ri.Error(ERR_FATAL, "Max FBO color buffers exceeded.\n");
return; return;
} }
fbo->color[fbo->numColorBufs++] = image; fbo->color[fbo->numColorBufs++] = image;
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->id); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->id);
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, (GLenum)(GL_COLOR_ATTACHMENT0_EXT + fbo->numColorBufs - 1), GL_TEXTURE_2D, image->texnum, 0); qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, (GLenum)(GL_COLOR_ATTACHMENT0_EXT + fbo->numColorBufs - 1), GL_TEXTURE_2D, image->texnum, 0);
} }
qboolean R_FBO_Check() qboolean R_FBO_Check()
{ {
GLenum status = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); GLenum status = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
const char* msg = "unknown error"; const char* msg = "unknown error";
switch (status) switch (status)
{ {
case GL_FRAMEBUFFER_COMPLETE_EXT: case GL_FRAMEBUFFER_COMPLETE_EXT:
return qtrue; return qtrue;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
msg = "incomplete attachment"; msg = "incomplete attachment";
break; break;
@ -145,134 +145,134 @@ qboolean R_FBO_Check()
default: default:
msg = va("unknown error (0x%x)", status); msg = va("unknown error (0x%x)", status);
break; break;
} }
ri.Error(ERR_FATAL, "Bad framebuffer setup for '%s': %s\n", glState.currentFBO->name, msg); ri.Error(ERR_FATAL, "Bad framebuffer setup for '%s': %s\n", glState.currentFBO->name, msg);
return qfalse; return qfalse;
} }
fbo_t* R_FBO_Bind(fbo_t* fbo) fbo_t* R_FBO_Bind(fbo_t* fbo)
{ {
fbo_t* old = glState.currentFBO; fbo_t* old = glState.currentFBO;
GLuint id = 0; GLuint id = 0;
if (!glRefConfig.framebufferObject) if (!glRefConfig.framebufferObject)
return NULL; return NULL;
if (glState.currentFBO == fbo) if (glState.currentFBO == fbo)
return old; return old;
glState.currentFBO = fbo; glState.currentFBO = fbo;
if (fbo) if (fbo)
id = fbo->id; id = fbo->id;
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id);
if (fbo) if (fbo)
{ {
if (1) if (1)
R_FBO_Check(); R_FBO_Check();
} }
return old; return old;
} }
void R_FBO_BindColorBuffer(fbo_t* fbo, int index) void R_FBO_BindColorBuffer(fbo_t* fbo, int index)
{ {
GL_Bind(fbo->color[index]); GL_Bind(fbo->color[index]);
} }
fbo_t* R_FBO_CreateEx(const char* name, int numColorBuffers, image_t** colorBuffers, fboZBuffer_t* depth, fboStencilBuffer_t* stencil) fbo_t* R_FBO_CreateEx(const char* name, int numColorBuffers, image_t** colorBuffers, fboZBuffer_t* depth, fboStencilBuffer_t* stencil)
{ {
fbo_t* fbo = NULL; fbo_t* fbo = NULL;
if (tr.fbo.numFBOs >= ARRAY_SIZE(tr.fbo.fbos)) if (tr.fbo.numFBOs >= ARRAY_SIZE(tr.fbo.fbos))
{ {
ri.Error(ERR_FATAL, "Too many FBO's\n"); ri.Error(ERR_FATAL, "Too many FBO's\n");
return NULL; return NULL;
} }
ri.Printf(PRINT_DEVELOPER, "Creating FBO %s: %d color/%d depth/%d stencil\n", name, numColorBuffers, depth != NULL, stencil != NULL); ri.Printf(PRINT_DEVELOPER, "Creating FBO %s: %d color/%d depth/%d stencil\n", name, numColorBuffers, depth != NULL, stencil != NULL);
fbo = ri.Hunk_Alloc(sizeof(*fbo), h_low); fbo = ri.Hunk_Alloc(sizeof(*fbo), h_low);
R_FBO_Init(fbo); R_FBO_Init(fbo);
Q_strncpyz(fbo->name, name, ARRAY_SIZE(fbo->name)); Q_strncpyz(fbo->name, name, ARRAY_SIZE(fbo->name));
while (numColorBuffers-- > 0) while (numColorBuffers-- > 0)
R_FBO_AddColorBuffer(fbo, *colorBuffers++); R_FBO_AddColorBuffer(fbo, *colorBuffers++);
fbo->depth = depth; fbo->depth = depth;
fbo->stencil = stencil; fbo->stencil = stencil;
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->id); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo->id);
if (fbo->depth) if (fbo->depth)
qglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->depth->id); qglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->depth->id);
if (fbo->stencil) if (fbo->stencil)
qglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->stencil->id); qglFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fbo->stencil->id);
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
tr.fbo.fbos[tr.fbo.numFBOs++] = fbo; tr.fbo.fbos[tr.fbo.numFBOs++] = fbo;
return fbo; return fbo;
} }
fbo_t* R_FBO_CreateSimple(const char* name, image_t* color, fboZBuffer_t* depth, fboStencilBuffer_t* stencil) fbo_t* R_FBO_CreateSimple(const char* name, image_t* color, fboZBuffer_t* depth, fboStencilBuffer_t* stencil)
{ {
return R_FBO_CreateEx(name, color != NULL, &color, depth, stencil); return R_FBO_CreateEx(name, color != NULL, &color, depth, stencil);
} }
void R_InitFBOs(void) void R_InitFBOs(void)
{ {
if (!glRefConfig.framebufferObject) if (!glRefConfig.framebufferObject)
return; return;
ri.Printf(PRINT_ALL, "------- R_InitFBOs -------\n"); ri.Printf(PRINT_ALL, "------- R_InitFBOs -------\n");
tr.fbo.full[0] = R_FBO_CreateSimple( tr.fbo.full[0] = R_FBO_CreateSimple(
"main", "main",
R_CreateImage("*framebuffer", NULL, glConfig.vidWidth, glConfig.vidHeight, qfalse, qfalse, GL_CLAMP_TO_EDGE), R_CreateImage("*framebuffer", NULL, glConfig.vidWidth, glConfig.vidHeight, qfalse, qfalse, GL_CLAMP_TO_EDGE),
R_FBO_CreateZBuffer(glConfig.vidWidth, glConfig.vidHeight), R_FBO_CreateZBuffer(glConfig.vidWidth, glConfig.vidHeight),
NULL); NULL);
tr.fbo.full[1] = R_FBO_CreateSimple( tr.fbo.full[1] = R_FBO_CreateSimple(
"postprocess", "postprocess",
R_CreateImage("*framebuffer", NULL, glConfig.vidWidth, glConfig.vidHeight, qfalse, qfalse, GL_CLAMP_TO_EDGE), R_CreateImage("*framebuffer", NULL, glConfig.vidWidth, glConfig.vidHeight, qfalse, qfalse, GL_CLAMP_TO_EDGE),
tr.fbo.full[0]->depth, tr.fbo.full[0]->depth,
NULL); NULL);
tr.fbo.quarter[0] = R_FBO_CreateSimple( tr.fbo.quarter[0] = R_FBO_CreateSimple(
"quarter0", "quarter0",
R_CreateImage("*quarterBuffer0", NULL, glConfig.vidWidth/2, glConfig.vidHeight/2, qfalse, qfalse, GL_CLAMP_TO_EDGE), R_CreateImage("*quarterBuffer0", NULL, glConfig.vidWidth/2, glConfig.vidHeight/2, qfalse, qfalse, GL_CLAMP_TO_EDGE),
NULL, NULL,
NULL); NULL);
tr.fbo.quarter[1] = R_FBO_CreateSimple( tr.fbo.quarter[1] = R_FBO_CreateSimple(
"quarter1", "quarter1",
R_CreateImage("*quarterBuffer1", NULL, glConfig.vidWidth/2, glConfig.vidHeight/2, qfalse, qfalse, GL_CLAMP_TO_EDGE), R_CreateImage("*quarterBuffer1", NULL, glConfig.vidWidth/2, glConfig.vidHeight/2, qfalse, qfalse, GL_CLAMP_TO_EDGE),
NULL, NULL,
NULL); NULL);
ri.Printf(PRINT_DEVELOPER, "Created %d FBOs\n", tr.fbo.numFBOs); ri.Printf(PRINT_DEVELOPER, "Created %d FBOs\n", tr.fbo.numFBOs);
} }
void R_ShutDownFBOs(void) void R_ShutDownFBOs(void)
{ {
if (!glRefConfig.framebufferObject) if (!glRefConfig.framebufferObject)
return; return;
ri.Printf(PRINT_ALL, "------- R_ShutdownFBOs -------\n"); ri.Printf(PRINT_ALL, "------- R_ShutdownFBOs -------\n");
R_FBO_Bind(NULL); R_FBO_Bind(NULL);
while (tr.fbo.numRenderBuffers>0) while (tr.fbo.numRenderBuffers>0)
R_FBO_ReleaseRenderBuffer(tr.fbo.renderBuffers[--tr.fbo.numRenderBuffers]); R_FBO_ReleaseRenderBuffer(tr.fbo.renderBuffers[--tr.fbo.numRenderBuffers]);
while (tr.fbo.numFBOs>0) while (tr.fbo.numFBOs>0)
R_FBO_Release(tr.fbo.fbos[--tr.fbo.numFBOs]); R_FBO_Release(tr.fbo.fbos[--tr.fbo.numFBOs]);
} }