Refactor texenv code in order to allow for stronger type checking
This commit is contained in:
parent
4ed5536bcc
commit
10e929d4bb
@ -4,20 +4,22 @@
|
||||
typedef struct
|
||||
{
|
||||
u16 srcRgb, srcAlpha;
|
||||
u16 opRgb, opAlpha;
|
||||
union
|
||||
{
|
||||
u32 opAll;
|
||||
struct { u32 opRgb:12, opAlpha:12; };
|
||||
};
|
||||
u16 funcRgb, funcAlpha;
|
||||
u32 color;
|
||||
u16 scaleRgb, scaleAlpha;
|
||||
} C3D_TexEnv;
|
||||
|
||||
enum
|
||||
typedef enum
|
||||
{
|
||||
C3D_RGB = BIT(0),
|
||||
C3D_Alpha = BIT(1),
|
||||
C3D_Both = C3D_RGB | C3D_Alpha,
|
||||
};
|
||||
|
||||
void TexEnv_Init(C3D_TexEnv* env);
|
||||
} C3D_TexEnvMode;
|
||||
|
||||
C3D_TexEnv* C3D_GetTexEnv(int id);
|
||||
void C3D_SetTexEnv(int id, C3D_TexEnv* env);
|
||||
@ -26,29 +28,71 @@ void C3D_DirtyTexEnv(C3D_TexEnv* env);
|
||||
void C3D_TexEnvBufUpdate(int mode, int mask);
|
||||
void C3D_TexEnvBufColor(u32 color);
|
||||
|
||||
static inline void C3D_TexEnvSrc(C3D_TexEnv* env, int mode, int s1, int s2, int s3)
|
||||
static inline void C3D_TexEnvInit(C3D_TexEnv* env)
|
||||
{
|
||||
int param = GPU_TEVSOURCES(s1, s2, s3);
|
||||
if (mode & C3D_RGB)
|
||||
env->srcRgb = GPU_TEVSOURCES(GPU_PREVIOUS, 0, 0);
|
||||
env->srcAlpha = env->srcRgb;
|
||||
env->opAll = 0;
|
||||
env->funcRgb = GPU_REPLACE;
|
||||
env->funcAlpha = env->funcRgb;
|
||||
env->color = 0xFFFFFFFF;
|
||||
env->scaleRgb = GPU_TEVSCALE_1;
|
||||
env->scaleAlpha = GPU_TEVSCALE_1;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define _C3D_DEFAULT(x) = x
|
||||
#else
|
||||
#define _C3D_DEFAULT(x)
|
||||
#endif
|
||||
|
||||
C3D_DEPRECATED static inline void TexEnv_Init(C3D_TexEnv* env)
|
||||
{
|
||||
C3D_TexEnvInit(env);
|
||||
}
|
||||
|
||||
static inline void C3D_TexEnvSrc(C3D_TexEnv* env, C3D_TexEnvMode mode,
|
||||
GPU_TEVSRC s1,
|
||||
GPU_TEVSRC s2 _C3D_DEFAULT(GPU_PRIMARY_COLOR),
|
||||
GPU_TEVSRC s3 _C3D_DEFAULT(GPU_PRIMARY_COLOR))
|
||||
{
|
||||
int param = GPU_TEVSOURCES((int)s1, (int)s2, (int)s3);
|
||||
if ((int)mode & C3D_RGB)
|
||||
env->srcRgb = param;
|
||||
if (mode & C3D_Alpha)
|
||||
if ((int)mode & C3D_Alpha)
|
||||
env->srcAlpha = param;
|
||||
}
|
||||
|
||||
static inline void C3D_TexEnvOp(C3D_TexEnv* env, int mode, int o1, int o2, int o3)
|
||||
C3D_DEPRECATED static inline void C3D_TexEnvOp(C3D_TexEnv* env, C3D_TexEnvMode mode, int o1, int o2, int o3)
|
||||
{
|
||||
int param = GPU_TEVOPERANDS(o1, o2, o3);
|
||||
if (mode & C3D_RGB)
|
||||
if ((int)mode & C3D_RGB)
|
||||
env->opRgb = param;
|
||||
if (mode & C3D_Alpha)
|
||||
if ((int)mode & C3D_Alpha)
|
||||
env->opAlpha = param;
|
||||
}
|
||||
|
||||
static inline void C3D_TexEnvFunc(C3D_TexEnv* env, int mode, int param)
|
||||
static inline void C3D_TexEnvOpRgb(C3D_TexEnv* env,
|
||||
GPU_TEVOP_RGB o1,
|
||||
GPU_TEVOP_RGB o2 _C3D_DEFAULT(GPU_TEVOP_RGB_SRC_COLOR),
|
||||
GPU_TEVOP_RGB o3 _C3D_DEFAULT(GPU_TEVOP_RGB_SRC_COLOR))
|
||||
{
|
||||
if (mode & C3D_RGB)
|
||||
env->opRgb = GPU_TEVOPERANDS((int)o1, (int)o2, (int)o3);
|
||||
}
|
||||
|
||||
static inline void C3D_TexEnvOpAlpha(C3D_TexEnv* env,
|
||||
GPU_TEVOP_A o1,
|
||||
GPU_TEVOP_A o2 _C3D_DEFAULT(GPU_TEVOP_A_SRC_ALPHA),
|
||||
GPU_TEVOP_A o3 _C3D_DEFAULT(GPU_TEVOP_A_SRC_ALPHA))
|
||||
{
|
||||
env->opAlpha = GPU_TEVOPERANDS((int)o1, (int)o2, (int)o3);
|
||||
}
|
||||
|
||||
static inline void C3D_TexEnvFunc(C3D_TexEnv* env, C3D_TexEnvMode mode, GPU_COMBINEFUNC param)
|
||||
{
|
||||
if ((int)mode & C3D_RGB)
|
||||
env->funcRgb = param;
|
||||
if (mode & C3D_Alpha)
|
||||
if ((int)mode & C3D_Alpha)
|
||||
env->funcAlpha = param;
|
||||
}
|
||||
|
||||
@ -57,10 +101,12 @@ static inline void C3D_TexEnvColor(C3D_TexEnv* env, u32 color)
|
||||
env->color = color;
|
||||
}
|
||||
|
||||
static inline void C3D_TexEnvScale(C3D_TexEnv* env, int mode, int param)
|
||||
static inline void C3D_TexEnvScale(C3D_TexEnv* env, int mode, GPU_TEVSCALE param)
|
||||
{
|
||||
if (mode & C3D_RGB)
|
||||
env->scaleRgb = param;
|
||||
if (mode & C3D_Alpha)
|
||||
env->scaleAlpha = param;
|
||||
}
|
||||
|
||||
#undef _C3D_DEFAULT
|
||||
|
@ -124,7 +124,7 @@ bool C3D_Init(size_t cmdBufSize)
|
||||
ctx->tex[i] = NULL;
|
||||
|
||||
for (i = 0; i < 6; i ++)
|
||||
TexEnv_Init(&ctx->texEnv[i]);
|
||||
C3D_TexEnvInit(&ctx->texEnv[i]);
|
||||
|
||||
ctx->fixedAttribDirty = 0;
|
||||
ctx->fixedAttribEverDirty = 0;
|
||||
|
@ -1,18 +1,5 @@
|
||||
#include "internal.h"
|
||||
|
||||
void TexEnv_Init(C3D_TexEnv* env)
|
||||
{
|
||||
env->srcRgb = GPU_TEVSOURCES(GPU_PREVIOUS, 0, 0);
|
||||
env->srcAlpha = env->srcRgb;
|
||||
env->opRgb = GPU_TEVOPERANDS(0,0,0);
|
||||
env->opAlpha = env->opRgb;
|
||||
env->funcRgb = GPU_REPLACE;
|
||||
env->funcAlpha = env->funcRgb;
|
||||
env->color = 0xFFFFFFFF;
|
||||
env->scaleRgb = GPU_TEVSCALE_1;
|
||||
env->scaleAlpha = GPU_TEVSCALE_1;
|
||||
}
|
||||
|
||||
C3D_TexEnv* C3D_GetTexEnv(int id)
|
||||
{
|
||||
C3D_Context* ctx = C3Di_GetContext();
|
||||
@ -31,8 +18,11 @@ void C3D_SetTexEnv(int id, C3D_TexEnv* env)
|
||||
if (!(ctx->flags & C3DiF_Active))
|
||||
return;
|
||||
|
||||
memcpy(&ctx->texEnv[id], env, sizeof(*env));
|
||||
ctx->flags |= C3DiF_TexEnv(id);
|
||||
if (env)
|
||||
memcpy(&ctx->texEnv[id], env, sizeof(*env));
|
||||
else
|
||||
C3D_TexEnvInit(&ctx->texEnv[id]);
|
||||
}
|
||||
|
||||
void C3D_DirtyTexEnv(C3D_TexEnv* env)
|
||||
|
Loading…
Reference in New Issue
Block a user