(RGL PS3) Cleanups
This commit is contained in:
parent
57b4de45a3
commit
6f88474985
|
@ -43,22 +43,11 @@ void rglSetVBlankHandler(void (*handler)(const GLuint head), RGLdevice *device);
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
// Texture.c
|
// Texture.c
|
||||||
//----------------------------------------
|
//----------------------------------------
|
||||||
rglTexture *rglAllocateTexture (void);
|
|
||||||
void rglFreeTexture (void *data);
|
|
||||||
extern int rglTextureInit( RGLcontext* context, GLuint name );
|
extern int rglTextureInit( RGLcontext* context, GLuint name );
|
||||||
extern void rglTextureDelete( RGLcontext* context, GLuint name );
|
extern void rglTextureDelete( RGLcontext* context, GLuint name );
|
||||||
extern GLboolean rglTextureHasValidLevels( const rglTexture *texture, int levels, int width, int height, int depth, GLenum format, GLenum type, GLenum internalFormat );
|
extern GLboolean rglTextureHasValidLevels( const rglTexture *texture, int levels, int width, int height, int depth, GLenum format, GLenum type, GLenum internalFormat );
|
||||||
extern GLboolean rglTextureIsValid( const rglTexture* texture );
|
|
||||||
GLenum rglGetEnabledTextureMode (const void *data);
|
|
||||||
extern rglTexture *rglGetCurrentTexture (const void *data, GLenum target);
|
extern rglTexture *rglGetCurrentTexture (const void *data, GLenum target);
|
||||||
RGL_EXPORT void rglUpdateCurrentTextureCache (void *data);
|
|
||||||
void rglReallocateImages (void *data, GLint level, GLsizei dimension);
|
void rglReallocateImages (void *data, GLint level, GLsizei dimension);
|
||||||
extern int rglGetImage( GLenum target, GLint level, rglTexture **texture, rglImage **image, GLsizei reallocateSize );
|
|
||||||
|
|
||||||
static inline rglTexture* rglGetTexture (RGLcontext *LContext, GLuint name)
|
|
||||||
{
|
|
||||||
return ( rglTexture* )LContext->textureNameSpace.data[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline rglTexture* rglGetTextureSafe (RGLcontext *LContext, GLuint name)
|
static inline rglTexture* rglGetTextureSafe (RGLcontext *LContext, GLuint name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3741,7 +3741,7 @@ GLAPI void APIENTRY glFramebufferTexture2DOES( GLenum target, GLenum attachment,
|
||||||
if (texture)
|
if (texture)
|
||||||
{
|
{
|
||||||
attach->type = RGL_FRAMEBUFFER_ATTACHMENT_TEXTURE;
|
attach->type = RGL_FRAMEBUFFER_ATTACHMENT_TEXTURE;
|
||||||
textureObject = rglGetTexture( LContext, texture );
|
textureObject = (rglTexture*)LContext->textureNameSpace.data[texture];
|
||||||
textureObject->framebuffers.pushBack( framebuffer );
|
textureObject->framebuffers.pushBack( framebuffer );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4228,6 +4228,56 @@ static void rglResetContext (void *data)
|
||||||
LContext->VSync = GL_FALSE;
|
LContext->VSync = GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static rglTexture *rglAllocateTexture(void)
|
||||||
|
{
|
||||||
|
GLuint size = sizeof(rglTexture) + sizeof(rglGcmTexture);
|
||||||
|
rglTexture *texture = (rglTexture*)malloc(size);
|
||||||
|
memset( texture, 0, size );
|
||||||
|
texture->target = 0;
|
||||||
|
texture->minFilter = GL_NEAREST_MIPMAP_LINEAR;
|
||||||
|
texture->magFilter = GL_LINEAR;
|
||||||
|
texture->minLod = -1000.f;
|
||||||
|
texture->maxLod = 1000.f;
|
||||||
|
texture->maxLevel = 1000;
|
||||||
|
texture->wrapS = GL_REPEAT;
|
||||||
|
texture->wrapT = GL_REPEAT;
|
||||||
|
texture->wrapR = GL_REPEAT;
|
||||||
|
texture->lodBias = 0.f;
|
||||||
|
texture->maxAnisotropy = 1.f;
|
||||||
|
texture->compareMode = GL_NONE;
|
||||||
|
texture->compareFunc = GL_LEQUAL;
|
||||||
|
texture->gammaRemap = 0;
|
||||||
|
texture->vertexEnable = GL_FALSE;
|
||||||
|
texture->usage = 0;
|
||||||
|
texture->isRenderTarget = GL_FALSE;
|
||||||
|
texture->image = NULL;
|
||||||
|
texture->isComplete = GL_FALSE;
|
||||||
|
texture->imageCount = 0;
|
||||||
|
texture->revalidate = 0;
|
||||||
|
texture->referenceBuffer = NULL;
|
||||||
|
new( &texture->framebuffers ) RGL::Vector<rglFramebuffer *>();
|
||||||
|
rglPlatformCreateTexture( texture );
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rglFreeTexture (void *data)
|
||||||
|
{
|
||||||
|
rglTexture *texture = (rglTexture*)data;
|
||||||
|
rglTextureTouchFBOs(texture);
|
||||||
|
texture->framebuffers.~Vector<rglFramebuffer *>();
|
||||||
|
|
||||||
|
if ( texture->image )
|
||||||
|
{
|
||||||
|
rglImage *image = texture->image;
|
||||||
|
rglImageFreeCPUStorage( image );
|
||||||
|
free( texture->image );
|
||||||
|
}
|
||||||
|
if ( texture->referenceBuffer )
|
||||||
|
texture->referenceBuffer->textureReferences.removeElement( texture );
|
||||||
|
rglPlatformDestroyTexture( texture );
|
||||||
|
free( texture );
|
||||||
|
}
|
||||||
|
|
||||||
RGLcontext* psglCreateContext(void)
|
RGLcontext* psglCreateContext(void)
|
||||||
{
|
{
|
||||||
RGLcontext* LContext = (RGLcontext*)malloc(sizeof(RGLcontext));
|
RGLcontext* LContext = (RGLcontext*)malloc(sizeof(RGLcontext));
|
||||||
|
@ -4335,7 +4385,8 @@ GLAPI void APIENTRY glEnable( GLenum cap )
|
||||||
{
|
{
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
LContext->CurrentImageUnit->enable2D = GL_TRUE;
|
LContext->CurrentImageUnit->enable2D = GL_TRUE;
|
||||||
rglUpdateCurrentTextureCache( LContext->CurrentImageUnit );
|
LContext->CurrentImageUnit->currentTexture = rglGetCurrentTexture( LContext->CurrentImageUnit,
|
||||||
|
LContext->CurrentImageUnit->fragmentTarget );
|
||||||
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
||||||
break;
|
break;
|
||||||
case GL_SHADER_SRGB_REMAP_SCE:
|
case GL_SHADER_SRGB_REMAP_SCE:
|
||||||
|
@ -4366,7 +4417,8 @@ GLAPI void APIENTRY glDisable( GLenum cap )
|
||||||
{
|
{
|
||||||
case GL_TEXTURE_2D:
|
case GL_TEXTURE_2D:
|
||||||
LContext->CurrentImageUnit->enable2D = GL_FALSE;
|
LContext->CurrentImageUnit->enable2D = GL_FALSE;
|
||||||
rglUpdateCurrentTextureCache( LContext->CurrentImageUnit );
|
LContext->CurrentImageUnit->currentTexture = rglGetCurrentTexture( LContext->CurrentImageUnit,
|
||||||
|
LContext->CurrentImageUnit->fragmentTarget );
|
||||||
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
||||||
break;
|
break;
|
||||||
case GL_SHADER_SRGB_REMAP_SCE:
|
case GL_SHADER_SRGB_REMAP_SCE:
|
||||||
|
@ -4477,84 +4529,6 @@ GLAPI void APIENTRY glViewport( GLint x, GLint y, GLsizei width, GLsizei height
|
||||||
TEXTURES (INTERNAL)
|
TEXTURES (INTERNAL)
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
rglTexture *rglAllocateTexture(void)
|
|
||||||
{
|
|
||||||
GLuint size = sizeof(rglTexture) + sizeof(rglGcmTexture);
|
|
||||||
rglTexture *texture = (rglTexture*)malloc(size);
|
|
||||||
memset( texture, 0, size );
|
|
||||||
texture->target = 0;
|
|
||||||
texture->minFilter = GL_NEAREST_MIPMAP_LINEAR;
|
|
||||||
texture->magFilter = GL_LINEAR;
|
|
||||||
texture->minLod = -1000.f;
|
|
||||||
texture->maxLod = 1000.f;
|
|
||||||
texture->maxLevel = 1000;
|
|
||||||
texture->wrapS = GL_REPEAT;
|
|
||||||
texture->wrapT = GL_REPEAT;
|
|
||||||
texture->wrapR = GL_REPEAT;
|
|
||||||
texture->lodBias = 0.f;
|
|
||||||
texture->maxAnisotropy = 1.f;
|
|
||||||
texture->compareMode = GL_NONE;
|
|
||||||
texture->compareFunc = GL_LEQUAL;
|
|
||||||
texture->gammaRemap = 0;
|
|
||||||
texture->vertexEnable = GL_FALSE;
|
|
||||||
texture->usage = 0;
|
|
||||||
texture->isRenderTarget = GL_FALSE;
|
|
||||||
texture->image = NULL;
|
|
||||||
texture->isComplete = GL_FALSE;
|
|
||||||
texture->imageCount = 0;
|
|
||||||
texture->revalidate = 0;
|
|
||||||
texture->referenceBuffer = NULL;
|
|
||||||
new( &texture->framebuffers ) RGL::Vector<rglFramebuffer *>();
|
|
||||||
rglPlatformCreateTexture( texture );
|
|
||||||
return texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rglFreeTexture (void *data)
|
|
||||||
{
|
|
||||||
rglTexture *texture = (rglTexture*)data;
|
|
||||||
rglTextureTouchFBOs(texture);
|
|
||||||
texture->framebuffers.~Vector<rglFramebuffer *>();
|
|
||||||
|
|
||||||
if ( texture->image )
|
|
||||||
{
|
|
||||||
rglImage *image = texture->image;
|
|
||||||
rglImageFreeCPUStorage( image );
|
|
||||||
free( texture->image );
|
|
||||||
}
|
|
||||||
if ( texture->referenceBuffer )
|
|
||||||
texture->referenceBuffer->textureReferences.removeElement( texture );
|
|
||||||
rglPlatformDestroyTexture( texture );
|
|
||||||
free( texture );
|
|
||||||
}
|
|
||||||
|
|
||||||
GLboolean rglTextureIsValid (const void *data)
|
|
||||||
{
|
|
||||||
const rglTexture *texture = (const rglTexture*)data;
|
|
||||||
|
|
||||||
if (texture->imageCount < 1)
|
|
||||||
return GL_FALSE;
|
|
||||||
if ( !texture->image )
|
|
||||||
return GL_FALSE;
|
|
||||||
|
|
||||||
const rglImage* image = texture->image;
|
|
||||||
|
|
||||||
GLenum format = image->format;
|
|
||||||
GLenum type = image->type;
|
|
||||||
GLenum internalFormat = image->internalFormat;
|
|
||||||
|
|
||||||
if (( texture->vertexEnable ) && ( internalFormat != GL_FLOAT_RGBA32 )
|
|
||||||
&& ( internalFormat != GL_RGBA32F_ARB ))
|
|
||||||
return GL_FALSE;
|
|
||||||
if (( internalFormat == 0 ) || ( format == 0 ) || ( type == 0 ) )
|
|
||||||
return GL_FALSE;
|
|
||||||
|
|
||||||
// don't need more than max level
|
|
||||||
if ( texture->imageCount < 1 )
|
|
||||||
return GL_FALSE;
|
|
||||||
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reallocate images held by a texture
|
// Reallocate images held by a texture
|
||||||
void rglReallocateImages (void *data, GLint level, GLsizei dimension )
|
void rglReallocateImages (void *data, GLint level, GLsizei dimension )
|
||||||
{
|
{
|
||||||
|
@ -4574,63 +4548,25 @@ void rglReallocateImages (void *data, GLint level, GLsizei dimension )
|
||||||
texture->imageCount = n;
|
texture->imageCount = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get an enabled texture mode of a texture image unit
|
|
||||||
GLenum rglGetEnabledTextureMode (const void *data)
|
|
||||||
{
|
|
||||||
const rglTextureImageUnit *unit = (const rglTextureImageUnit*)data;
|
|
||||||
// here, if fragment program is enabled and a valid program is set, get the enabled
|
|
||||||
// units from the program instead of the texture units.
|
|
||||||
if ( _CurrentContext->BoundFragmentProgram != NULL && _CurrentContext->FragmentProgram != GL_FALSE)
|
|
||||||
return unit->fragmentTarget;
|
|
||||||
else if ( unit->enable2D )
|
|
||||||
return GL_TEXTURE_2D;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rglTexture *rglGetCurrentTexture (const void *data, GLenum target)
|
rglTexture *rglGetCurrentTexture (const void *data, GLenum target)
|
||||||
{
|
{
|
||||||
const rglTextureImageUnit *unit = (const rglTextureImageUnit*)data;
|
const rglTextureImageUnit *unit = (const rglTextureImageUnit*)data;
|
||||||
RGLcontext* LContext = _CurrentContext;
|
RGLcontext* LContext = _CurrentContext;
|
||||||
GLuint name = 0;
|
GLuint name = unit->bound2D;
|
||||||
rglTexture *defaultTexture = NULL;
|
rglTexture *defaultTexture = unit->default2D;
|
||||||
switch ( target )
|
|
||||||
{
|
|
||||||
case GL_TEXTURE_2D:
|
|
||||||
name = unit->bound2D;
|
|
||||||
defaultTexture = unit->default2D;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (name)
|
if (name)
|
||||||
return ( rglTexture * )LContext->textureNameSpace.data[name];
|
return ( rglTexture * )LContext->textureNameSpace.data[name];
|
||||||
else
|
else
|
||||||
return defaultTexture;
|
return defaultTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rglUpdateCurrentTextureCache (void *data)
|
static void rglGetImage( GLenum target, GLint level, rglTexture **texture, rglImage **image, GLsizei reallocateSize )
|
||||||
{
|
|
||||||
rglTextureImageUnit *unit = (rglTextureImageUnit*)data;
|
|
||||||
GLenum target = rglGetEnabledTextureMode( unit );
|
|
||||||
unit->currentTexture = rglGetCurrentTexture( unit, target );
|
|
||||||
}
|
|
||||||
|
|
||||||
int rglGetImage( GLenum target, GLint level, rglTexture **texture, rglImage **image, GLsizei reallocateSize )
|
|
||||||
{
|
{
|
||||||
RGLcontext* LContext = _CurrentContext;
|
RGLcontext* LContext = _CurrentContext;
|
||||||
rglTextureImageUnit *unit = LContext->CurrentImageUnit;
|
rglTextureImageUnit *unit = LContext->CurrentImageUnit;
|
||||||
|
|
||||||
GLenum expectedTarget = 0;
|
GLenum expectedTarget = GL_TEXTURE_2D;
|
||||||
switch ( target )
|
|
||||||
{
|
|
||||||
case GL_TEXTURE_2D:
|
|
||||||
expectedTarget = GL_TEXTURE_2D;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rglSetError( GL_INVALID_ENUM );
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rglTexture *tex = rglGetCurrentTexture( unit, expectedTarget );
|
rglTexture *tex = rglGetCurrentTexture( unit, expectedTarget );
|
||||||
|
|
||||||
|
@ -4639,7 +4575,6 @@ int rglGetImage( GLenum target, GLint level, rglTexture **texture, rglImage **im
|
||||||
|
|
||||||
*image = tex->image + level;
|
*image = tex->image + level;
|
||||||
*texture = tex;
|
*texture = tex;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void rglBindTextureInternal (void *data, GLuint name, GLenum target )
|
void rglBindTextureInternal (void *data, GLuint name, GLenum target )
|
||||||
|
@ -4658,8 +4593,8 @@ void rglBindTextureInternal (void *data, GLuint name, GLenum target )
|
||||||
}
|
}
|
||||||
|
|
||||||
unit->bound2D = name;
|
unit->bound2D = name;
|
||||||
|
unit->currentTexture = rglGetCurrentTexture( unit, unit->fragmentTarget );
|
||||||
|
|
||||||
rglUpdateCurrentTextureCache( unit );
|
|
||||||
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4695,7 +4630,7 @@ GLAPI void APIENTRY glDeleteTextures( GLsizei n, const GLuint *textures )
|
||||||
}
|
}
|
||||||
if ( dirty )
|
if ( dirty )
|
||||||
{
|
{
|
||||||
rglUpdateCurrentTextureCache( tu );
|
tu->currentTexture = rglGetCurrentTexture( tu, tu->fragmentTarget );
|
||||||
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
LContext->needValidate |= RGL_VALIDATE_TEXTURES_USED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4778,8 +4713,7 @@ GLAPI void APIENTRY glTexImage2D( GLenum target, GLint level, GLint internalForm
|
||||||
|
|
||||||
rglTexture *texture;
|
rglTexture *texture;
|
||||||
rglImage *image;
|
rglImage *image;
|
||||||
if (rglGetImage(target, level, &texture, &image, MAX(width, height)))
|
rglGetImage(target, level, &texture, &image, MAX(width, height));
|
||||||
return;
|
|
||||||
|
|
||||||
image->dataState = RGL_IMAGE_DATASTATE_UNSET;
|
image->dataState = RGL_IMAGE_DATASTATE_UNSET;
|
||||||
|
|
||||||
|
|
|
@ -4312,7 +4312,8 @@ CGGL_API void cgGLEnableProfile( CGprofile profile )
|
||||||
for ( GLuint i = 0; i < current->samplerCount; ++i )
|
for ( GLuint i = 0; i < current->samplerCount; ++i )
|
||||||
{
|
{
|
||||||
int unit = current->samplerUnits[i];
|
int unit = current->samplerUnits[i];
|
||||||
rglUpdateCurrentTextureCache( &_CurrentContext->TextureImageUnits[unit] );
|
rglTextureImageUnit *unit_ptr = (rglTextureImageUnit*)&_CurrentContext->TextureImageUnits[unit];
|
||||||
|
unit_ptr->currentTexture = rglGetCurrentTexture( unit_ptr, unit_ptr->fragmentTarget );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LContext->needValidate |= PSGL_VALIDATE_FRAGMENT_PROGRAM | PSGL_VALIDATE_TEXTURES_USED;
|
LContext->needValidate |= PSGL_VALIDATE_FRAGMENT_PROGRAM | PSGL_VALIDATE_TEXTURES_USED;
|
||||||
|
@ -4428,7 +4429,8 @@ CGGL_API void cgGLBindProgram( CGprogram program )
|
||||||
// find out which texture unit this parameter has been assigned to
|
// find out which texture unit this parameter has been assigned to
|
||||||
unsigned int unit = parameter->resource - CG_TEXUNIT0;
|
unsigned int unit = parameter->resource - CG_TEXUNIT0;
|
||||||
_CurrentContext->TextureImageUnits[unit].fragmentTarget = rtParameter->glType;
|
_CurrentContext->TextureImageUnits[unit].fragmentTarget = rtParameter->glType;
|
||||||
rglUpdateCurrentTextureCache( &_CurrentContext->TextureImageUnits[unit] );
|
rglTextureImageUnit *unit_ptr = (rglTextureImageUnit*)&_CurrentContext->TextureImageUnits[unit];
|
||||||
|
unit_ptr->currentTexture = rglGetCurrentTexture( unit_ptr, unit_ptr->fragmentTarget );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue