mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2025-03-02 07:12:56 +00:00
Line endings.
This commit is contained in:
parent
65853bf81c
commit
dffc983550
1 changed files with 222 additions and 222 deletions
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue