nv2a: Handle point sprites, scaling

This commit is contained in:
Matt Borgerson 2021-07-10 02:15:15 -07:00 committed by mborgerson
parent fbff731cc3
commit 203c76f89c
8 changed files with 84 additions and 1 deletions

View File

@ -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;

View File

@ -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

View File

@ -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 *)&parameter; /* 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],

View File

@ -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)

View File

@ -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");

View File

@ -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];

View File

@ -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");
}

View File

@ -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 {