mirror of https://github.com/xemu-project/xemu.git
nv2a: Handle point sprites, scaling
This commit is contained in:
parent
fbff731cc3
commit
203c76f89c
|
@ -334,6 +334,8 @@ typedef struct PGRAPHState {
|
|||
float light_local_position[NV2A_MAX_LIGHTS][3];
|
||||
float light_local_attenuation[NV2A_MAX_LIGHTS][3];
|
||||
|
||||
float point_params[8];
|
||||
|
||||
VertexAttribute vertex_attributes[NV2A_VERTEXSHADER_ATTRIBUTES];
|
||||
uint16_t compressed_attrs;
|
||||
|
||||
|
|
|
@ -290,6 +290,7 @@
|
|||
# define NV_PGRAPH_CSV0_D_FOGGENMODE_ABS_PLANAR 3
|
||||
# define NV_PGRAPH_CSV0_D_FOGGENMODE_FOG_X 4
|
||||
# define NV_PGRAPH_CSV0_D_MODE 0xC0000000
|
||||
# define NV_PGRAPH_CSV0_D_POINTPARAMSENABLE 0x02000000
|
||||
# define NV_PGRAPH_CSV0_D_SKIN 0x1C000000
|
||||
# define NV_PGRAPH_CSV0_D_SKIN_OFF 0
|
||||
# define NV_PGRAPH_CSV0_D_SKIN_2G 1
|
||||
|
@ -451,6 +452,7 @@
|
|||
# define NV_PGRAPH_CONTROL_3_FOG_MODE_EXP_ABS 5
|
||||
# define NV_PGRAPH_CONTROL_3_FOG_MODE_EXP2_ABS 7
|
||||
# define NV_PGRAPH_CONTROL_3_FOG_MODE_LINEAR_ABS 4
|
||||
# define NV_PGRAPH_CONTROL_3_POINTPARAMSENABLE (1 << 9)
|
||||
#define NV_PGRAPH_FOGCOLOR 0x00001980
|
||||
# define NV_PGRAPH_FOGCOLOR_RED 0x00FF0000
|
||||
# define NV_PGRAPH_FOGCOLOR_GREEN 0x0000FF00
|
||||
|
@ -458,6 +460,7 @@
|
|||
# define NV_PGRAPH_FOGCOLOR_ALPHA 0xFF000000
|
||||
#define NV_PGRAPH_FOGPARAM0 0x00001984
|
||||
#define NV_PGRAPH_FOGPARAM1 0x00001988
|
||||
#define NV_PGRAPH_POINTSIZE 0x0000198C
|
||||
#define NV_PGRAPH_SETUPRASTER 0x00001990
|
||||
# define NV_PGRAPH_SETUPRASTER_FRONTFACEMODE 0x00000003
|
||||
# define NV_PGRAPH_SETUPRASTER_FRONTFACEMODE_FILL 0
|
||||
|
@ -467,6 +470,7 @@
|
|||
# define NV_PGRAPH_SETUPRASTER_POFFSETPOINTENABLE (1 << 6)
|
||||
# define NV_PGRAPH_SETUPRASTER_POFFSETLINEENABLE (1 << 7)
|
||||
# define NV_PGRAPH_SETUPRASTER_POFFSETFILLENABLE (1 << 8)
|
||||
# define NV_PGRAPH_SETUPRASTER_POINTSMOOTHENABLE (1 << 9)
|
||||
# define NV_PGRAPH_SETUPRASTER_LINESMOOTHENABLE (1 << 10)
|
||||
# define NV_PGRAPH_SETUPRASTER_POLYSMOOTHENABLE (1 << 11)
|
||||
# define NV_PGRAPH_SETUPRASTER_CULLCTRL 0x00600000
|
||||
|
@ -858,6 +862,8 @@
|
|||
# define NV097_SET_DEPTH_TEST_ENABLE 0x0000030C
|
||||
# define NV097_SET_DITHER_ENABLE 0x00000310
|
||||
# define NV097_SET_LIGHTING_ENABLE 0x00000314
|
||||
# define NV097_SET_POINT_PARAMS_ENABLE 0x00000318
|
||||
# define NV097_SET_POINT_SMOOTH_ENABLE 0x0000031C
|
||||
# define NV097_SET_LINE_SMOOTH_ENABLE 0x00000320
|
||||
# define NV097_SET_POLY_SMOOTH_ENABLE 0x00000324
|
||||
# define NV097_SET_SKIN_MODE 0x00000328
|
||||
|
@ -971,6 +977,8 @@
|
|||
# define NV097_SET_TEXGEN_R 0x000003C8
|
||||
# define NV097_SET_TEXGEN_Q 0x000003CC
|
||||
# define NV097_SET_TEXTURE_MATRIX_ENABLE 0x00000420
|
||||
# define NV097_SET_POINT_SIZE 0x0000043C
|
||||
# define NV097_SET_POINT_SIZE_V 0x000001FF
|
||||
# define NV097_SET_PROJECTION_MATRIX 0x00000440
|
||||
# define NV097_SET_MODEL_VIEW_MATRIX 0x00000480
|
||||
# define NV097_SET_INVERSE_MODEL_VIEW_MATRIX 0x00000580
|
||||
|
@ -987,6 +995,7 @@
|
|||
# define NV097_SET_FOG_PLANE 0x000009D0
|
||||
# define NV097_SET_SCENE_AMBIENT_COLOR 0x00000A10
|
||||
# define NV097_SET_VIEWPORT_OFFSET 0x00000A20
|
||||
# define NV097_SET_POINT_PARAMS 0x00000A30
|
||||
# define NV097_SET_EYE_POSITION 0x00000A50
|
||||
# define NV097_SET_COMBINER_FACTOR0 0x00000A60
|
||||
# define NV097_SET_COMBINER_FACTOR1 0x00000A80
|
||||
|
|
|
@ -1364,6 +1364,20 @@ DEF_METHOD(NV097, SET_LIGHTING_ENABLE)
|
|||
parameter);
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_POINT_PARAMS_ENABLE)
|
||||
{
|
||||
SET_MASK(pg->regs[NV_PGRAPH_CSV0_D], NV_PGRAPH_CSV0_D_POINTPARAMSENABLE,
|
||||
parameter);
|
||||
SET_MASK(pg->regs[NV_PGRAPH_CONTROL_3],
|
||||
NV_PGRAPH_CONTROL_3_POINTPARAMSENABLE, parameter);
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_POINT_SMOOTH_ENABLE)
|
||||
{
|
||||
SET_MASK(pg->regs[NV_PGRAPH_SETUPRASTER],
|
||||
NV_PGRAPH_SETUPRASTER_POINTSMOOTHENABLE, parameter);
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_LINE_SMOOTH_ENABLE)
|
||||
{
|
||||
SET_MASK(pg->regs[NV_PGRAPH_SETUPRASTER],
|
||||
|
@ -1748,6 +1762,11 @@ DEF_METHOD(NV097, SET_TEXTURE_MATRIX_ENABLE)
|
|||
pg->texture_matrix_enable[slot] = parameter;
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_POINT_SIZE)
|
||||
{
|
||||
SET_MASK(pg->regs[NV_PGRAPH_POINTSIZE], NV097_SET_POINT_SIZE_V, parameter);
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_PROJECTION_MATRIX)
|
||||
{
|
||||
INC_METHOD_LOOP_BEGIN(NV097, SET_PROJECTION_MATRIX)
|
||||
|
@ -1887,6 +1906,16 @@ DEF_METHOD(NV097, SET_VIEWPORT_OFFSET)
|
|||
INC_METHOD_LOOP_END
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_POINT_PARAMS)
|
||||
{
|
||||
INC_METHOD_LOOP_BEGIN(NV097, SET_POINT_PARAMS)
|
||||
|
||||
int slot = (method - NV097_SET_POINT_PARAMS) / 4;
|
||||
pg->point_params[slot] = *(float *)¶meter; /* FIXME: Where? */
|
||||
|
||||
INC_METHOD_LOOP_END
|
||||
}
|
||||
|
||||
DEF_METHOD(NV097, SET_EYE_POSITION)
|
||||
{
|
||||
INC_METHOD_LOOP_BEGIN(NV097, SET_EYE_POSITION)
|
||||
|
@ -2571,6 +2600,8 @@ DEF_METHOD(NV097, SET_BEGIN_END)
|
|||
glDisable(GL_DITHER);
|
||||
}
|
||||
|
||||
glEnable(GL_PROGRAM_POINT_SIZE);
|
||||
|
||||
/* Edge Antialiasing */
|
||||
if (pg->regs[NV_PGRAPH_SETUPRASTER] &
|
||||
NV_PGRAPH_SETUPRASTER_LINESMOOTHENABLE) {
|
||||
|
@ -3769,6 +3800,9 @@ static void pgraph_bind_shaders(PGRAPHState *pg)
|
|||
state.psh.alpha_func = (enum PshAlphaFunc)GET_MASK(pg->regs[NV_PGRAPH_CONTROL_0],
|
||||
NV_PGRAPH_CONTROL_0_ALPHAFUNC);
|
||||
|
||||
state.psh.point_sprite = pg->regs[NV_PGRAPH_SETUPRASTER] &
|
||||
NV_PGRAPH_SETUPRASTER_POINTSMOOTHENABLE;
|
||||
|
||||
state.fixed_function = fixed_function;
|
||||
|
||||
/* fixed function stuff */
|
||||
|
@ -3792,6 +3826,16 @@ static void pgraph_bind_shaders(PGRAPHState *pg)
|
|||
state.z_perspective = pg->regs[NV_PGRAPH_CONTROL_0]
|
||||
& NV_PGRAPH_CONTROL_0_Z_PERSPECTIVE_ENABLE;
|
||||
|
||||
state.point_params_enable = GET_MASK(pg->regs[NV_PGRAPH_CSV0_D],
|
||||
NV_PGRAPH_CSV0_D_POINTPARAMSENABLE);
|
||||
state.point_size =
|
||||
GET_MASK(pg->regs[NV_PGRAPH_POINTSIZE], NV097_SET_POINT_SIZE_V) / 8.0f;
|
||||
if (state.point_params_enable) {
|
||||
for (int i = 0; i < 8; i++) {
|
||||
state.point_params[i] = pg->point_params[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* geometry shader stuff */
|
||||
state.primitive_mode = (enum ShaderPrimitiveMode)pg->primitive_mode;
|
||||
state.polygon_front_mode = (enum ShaderPolygonMode)GET_MASK(pg->regs[NV_PGRAPH_SETUPRASTER],
|
||||
|
|
|
@ -41,6 +41,8 @@ DEF_METHOD(NV097, SET_CULL_FACE_ENABLE)
|
|||
DEF_METHOD(NV097, SET_DEPTH_TEST_ENABLE)
|
||||
DEF_METHOD(NV097, SET_DITHER_ENABLE)
|
||||
DEF_METHOD(NV097, SET_LIGHTING_ENABLE)
|
||||
DEF_METHOD(NV097, SET_POINT_PARAMS_ENABLE)
|
||||
DEF_METHOD(NV097, SET_POINT_SMOOTH_ENABLE)
|
||||
DEF_METHOD(NV097, SET_LINE_SMOOTH_ENABLE)
|
||||
DEF_METHOD(NV097, SET_POLY_SMOOTH_ENABLE)
|
||||
DEF_METHOD(NV097, SET_SKIN_MODE)
|
||||
|
@ -80,6 +82,7 @@ DEF_METHOD_CASE_4(NV097, SET_TEXGEN_T, 16)
|
|||
DEF_METHOD_CASE_4(NV097, SET_TEXGEN_R, 16)
|
||||
DEF_METHOD_CASE_4(NV097, SET_TEXGEN_Q, 16)
|
||||
DEF_METHOD_CASE_4(NV097, SET_TEXTURE_MATRIX_ENABLE, 4)
|
||||
DEF_METHOD(NV097, SET_POINT_SIZE)
|
||||
DEF_METHOD_RANGE(NV097, SET_PROJECTION_MATRIX, 0x3c)
|
||||
DEF_METHOD_RANGE(NV097, SET_MODEL_VIEW_MATRIX, 0xfc)
|
||||
DEF_METHOD_RANGE(NV097, SET_INVERSE_MODEL_VIEW_MATRIX, 0xfc)
|
||||
|
@ -91,6 +94,7 @@ DEF_METHOD(NV097, SET_TEXGEN_VIEW_MODEL)
|
|||
DEF_METHOD_RANGE(NV097, SET_FOG_PLANE, 12)
|
||||
DEF_METHOD_RANGE(NV097, SET_SCENE_AMBIENT_COLOR, 8)
|
||||
DEF_METHOD_RANGE(NV097, SET_VIEWPORT_OFFSET, 12)
|
||||
DEF_METHOD_RANGE(NV097, SET_POINT_PARAMS, 32)
|
||||
DEF_METHOD_RANGE(NV097, SET_EYE_POSITION, 12)
|
||||
DEF_METHOD_RANGE(NV097, SET_COMBINER_FACTOR0, 28)
|
||||
DEF_METHOD_RANGE(NV097, SET_COMBINER_FACTOR1, 28)
|
||||
|
|
|
@ -644,7 +644,12 @@ static MString* psh_convert(struct PixelShader *ps)
|
|||
mstring_append(vars, "vec4 pT0 = vtx.T0 / vtx.inv_w;\n");
|
||||
mstring_append(vars, "vec4 pT1 = vtx.T1 / vtx.inv_w;\n");
|
||||
mstring_append(vars, "vec4 pT2 = vtx.T2 / vtx.inv_w;\n");
|
||||
mstring_append(vars, "vec4 pT3 = vtx.T3 / vtx.inv_w;\n");
|
||||
if (ps->state.point_sprite) {
|
||||
assert(!ps->state.rect_tex[3]);
|
||||
mstring_append(vars, "vec4 pT3 = vec4(gl_PointCoord, 1.0, 1.0);\n");
|
||||
} else {
|
||||
mstring_append(vars, "vec4 pT3 = vtx.T3 / vtx.inv_w;\n");
|
||||
}
|
||||
mstring_append(vars, "\n");
|
||||
mstring_append(vars, "vec4 v0 = pD0;\n");
|
||||
mstring_append(vars, "vec4 v1 = pD1;\n");
|
||||
|
|
|
@ -50,6 +50,7 @@ typedef struct PshState {
|
|||
uint32_t rgb_inputs[8], rgb_outputs[8];
|
||||
uint32_t alpha_inputs[8], alpha_outputs[8];
|
||||
|
||||
bool point_sprite;
|
||||
bool rect_tex[4];
|
||||
bool snorm_tex[4];
|
||||
bool compare_mode[4][4];
|
||||
|
|
|
@ -655,6 +655,20 @@ GLSL_DEFINE(materialEmissionColor, GLSL_LTCTXA(NV_IGRAPH_XF_LTCTXA_CM_COL) ".xyz
|
|||
" oPos = invViewport * (tPosition * compositeMat);\n"
|
||||
" oPos.z = oPos.z * 2.0 - oPos.w;\n");
|
||||
|
||||
/* FIXME: Testing */
|
||||
if (state.point_params_enable) {
|
||||
mstring_append_fmt(
|
||||
body,
|
||||
" float d_e = length(position * modelViewMat0);\n"
|
||||
" oPts.x = 1/sqrt(%f + %f*d_e + %f*d_e*d_e) + %f;\n",
|
||||
state.point_params[0], state.point_params[1], state.point_params[2],
|
||||
state.point_params[6]);
|
||||
mstring_append_fmt(body, " oPts.x = min(oPts.x*%f + %f, 64.0);\n",
|
||||
state.point_params[3], state.point_params[7]);
|
||||
} else {
|
||||
mstring_append_fmt(body, " oPts.x = %f;\n", state.point_size);
|
||||
}
|
||||
|
||||
mstring_append(body, " vtx.inv_w = 1.0 / oPos.w;\n");
|
||||
|
||||
}
|
||||
|
|
|
@ -89,6 +89,10 @@ typedef struct ShaderState {
|
|||
enum ShaderPolygonMode polygon_front_mode;
|
||||
enum ShaderPolygonMode polygon_back_mode;
|
||||
enum ShaderPrimitiveMode primitive_mode;
|
||||
|
||||
bool point_params_enable;
|
||||
float point_size;
|
||||
float point_params[8];
|
||||
} ShaderState;
|
||||
|
||||
typedef struct ShaderBinding {
|
||||
|
|
Loading…
Reference in New Issue