mirror of https://github.com/xemu-project/xemu.git
quick support for w buffers
This commit is contained in:
parent
32a04b3f38
commit
20264b1df8
|
@ -394,6 +394,7 @@
|
||||||
# define NV_PGRAPH_CONTROL_0_ZFUNC_GEQUAL 6
|
# define NV_PGRAPH_CONTROL_0_ZFUNC_GEQUAL 6
|
||||||
# define NV_PGRAPH_CONTROL_0_ZFUNC_ALWAYS 7
|
# define NV_PGRAPH_CONTROL_0_ZFUNC_ALWAYS 7
|
||||||
# define NV_PGRAPH_CONTROL_0_DITHERENABLE (1 << 22)
|
# define NV_PGRAPH_CONTROL_0_DITHERENABLE (1 << 22)
|
||||||
|
# define NV_PGRAPH_CONTROL_0_Z_PERSPECTIVE_ENABLE (1 << 23)
|
||||||
# define NV_PGRAPH_CONTROL_0_ZWRITEENABLE (1 << 24)
|
# define NV_PGRAPH_CONTROL_0_ZWRITEENABLE (1 << 24)
|
||||||
# define NV_PGRAPH_CONTROL_0_STENCIL_WRITE_ENABLE (1 << 25)
|
# define NV_PGRAPH_CONTROL_0_STENCIL_WRITE_ENABLE (1 << 25)
|
||||||
# define NV_PGRAPH_CONTROL_0_ALPHA_WRITE_ENABLE (1 << 26)
|
# define NV_PGRAPH_CONTROL_0_ALPHA_WRITE_ENABLE (1 << 26)
|
||||||
|
@ -765,6 +766,7 @@
|
||||||
# define NV097_SET_CONTROL0 0x00970290
|
# define NV097_SET_CONTROL0 0x00970290
|
||||||
# define NV097_SET_CONTROL0_STENCIL_WRITE_ENABLE (1 << 0)
|
# define NV097_SET_CONTROL0_STENCIL_WRITE_ENABLE (1 << 0)
|
||||||
# define NV097_SET_CONTROL0_Z_FORMAT (1 << 12)
|
# define NV097_SET_CONTROL0_Z_FORMAT (1 << 12)
|
||||||
|
# define NV097_SET_CONTROL0_Z_PERSPECTIVE_ENABLE (1 << 16)
|
||||||
# define NV097_SET_FOG_MODE 0x0097029C
|
# define NV097_SET_FOG_MODE 0x0097029C
|
||||||
# define NV097_SET_FOG_MODE_V_LINEAR 0x2601
|
# define NV097_SET_FOG_MODE_V_LINEAR 0x2601
|
||||||
# define NV097_SET_FOG_MODE_V_EXP 0x800
|
# define NV097_SET_FOG_MODE_V_EXP 0x800
|
||||||
|
@ -2943,20 +2945,20 @@ static void pgraph_bind_shaders(PGRAPHState *pg)
|
||||||
NV_PGRAPH_CONTROL_0_ALPHAFUNC),
|
NV_PGRAPH_CONTROL_0_ALPHAFUNC),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/* fixed function stuff */
|
||||||
.skinning = GET_MASK(pg->regs[NV_PGRAPH_CSV0_D],
|
.skinning = GET_MASK(pg->regs[NV_PGRAPH_CSV0_D],
|
||||||
NV_PGRAPH_CSV0_D_SKIN),
|
NV_PGRAPH_CSV0_D_SKIN),
|
||||||
|
|
||||||
.lighting = GET_MASK(pg->regs[NV_PGRAPH_CSV0_C],
|
.lighting = GET_MASK(pg->regs[NV_PGRAPH_CSV0_C],
|
||||||
NV_PGRAPH_CSV0_C_LIGHTING),
|
NV_PGRAPH_CSV0_C_LIGHTING),
|
||||||
|
|
||||||
.normalization = pg->regs[NV_PGRAPH_CSV0_C]
|
.normalization = pg->regs[NV_PGRAPH_CSV0_C]
|
||||||
& NV_PGRAPH_CSV0_C_NORMALIZATION_ENABLE,
|
& NV_PGRAPH_CSV0_C_NORMALIZATION_ENABLE,
|
||||||
|
|
||||||
/* fixed function stuff */
|
|
||||||
.fixed_function = fixed_function,
|
.fixed_function = fixed_function,
|
||||||
|
|
||||||
/* vertex program stuff */
|
/* vertex program stuff */
|
||||||
.vertex_program = vertex_program,
|
.vertex_program = vertex_program,
|
||||||
|
.z_perspective = pg->regs[NV_PGRAPH_CONTROL_0]
|
||||||
|
& NV_PGRAPH_CONTROL_0_Z_PERSPECTIVE_ENABLE,
|
||||||
|
|
||||||
/* geometry shader stuff */
|
/* geometry shader stuff */
|
||||||
.primitive_mode = pg->primitive_mode,
|
.primitive_mode = pg->primitive_mode,
|
||||||
|
@ -4297,6 +4299,12 @@ static void pgraph_method(NV2AState *d,
|
||||||
uint32_t z_format = GET_MASK(parameter, NV097_SET_CONTROL0_Z_FORMAT);
|
uint32_t z_format = GET_MASK(parameter, NV097_SET_CONTROL0_Z_FORMAT);
|
||||||
SET_MASK(pg->regs[NV_PGRAPH_SETUPRASTER],
|
SET_MASK(pg->regs[NV_PGRAPH_SETUPRASTER],
|
||||||
NV_PGRAPH_SETUPRASTER_Z_FORMAT, z_format);
|
NV_PGRAPH_SETUPRASTER_Z_FORMAT, z_format);
|
||||||
|
|
||||||
|
bool z_perspective =
|
||||||
|
parameter & NV097_SET_CONTROL0_Z_PERSPECTIVE_ENABLE;
|
||||||
|
SET_MASK(pg->regs[NV_PGRAPH_CONTROL_0],
|
||||||
|
NV_PGRAPH_CONTROL_0_Z_PERSPECTIVE_ENABLE,
|
||||||
|
z_perspective);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -628,6 +628,7 @@ static QString *generate_vertex_shader(const ShaderState state,
|
||||||
vsh_translate(VSH_VERSION_XVS,
|
vsh_translate(VSH_VERSION_XVS,
|
||||||
(uint32_t*)state.program_data,
|
(uint32_t*)state.program_data,
|
||||||
state.program_length,
|
state.program_length,
|
||||||
|
state.z_perspective,
|
||||||
header, body);
|
header, body);
|
||||||
} else {
|
} else {
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
|
@ -74,6 +74,7 @@ typedef struct ShaderState {
|
||||||
bool vertex_program;
|
bool vertex_program;
|
||||||
uint32_t program_data[NV2A_MAX_TRANSFORM_PROGRAM_LENGTH][VSH_TOKEN_SIZE];
|
uint32_t program_data[NV2A_MAX_TRANSFORM_PROGRAM_LENGTH][VSH_TOKEN_SIZE];
|
||||||
int program_length;
|
int program_length;
|
||||||
|
bool z_perspective;
|
||||||
|
|
||||||
/* primitive format for geometry shader */
|
/* primitive format for geometry shader */
|
||||||
enum ShaderPolygonMode polygon_front_mode;
|
enum ShaderPolygonMode polygon_front_mode;
|
||||||
|
|
|
@ -690,9 +690,10 @@ static const char* vsh_header =
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
void vsh_translate(uint16_t version,
|
void vsh_translate(uint16_t version,
|
||||||
const uint32_t *tokens,
|
const uint32_t *tokens,
|
||||||
unsigned int length,
|
unsigned int length,
|
||||||
QString *header, QString *body)
|
bool z_perspective,
|
||||||
|
QString *header, QString *body)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
@ -732,7 +733,8 @@ void vsh_translate(uint16_t version,
|
||||||
" vtx.inv_w = 1.0;\n"
|
" vtx.inv_w = 1.0;\n"
|
||||||
" } else {\n"
|
" } else {\n"
|
||||||
" vtx.inv_w = 1.0 / oPos.w;\n"
|
" vtx.inv_w = 1.0 / oPos.w;\n"
|
||||||
" }\n");
|
" }\n"
|
||||||
|
);
|
||||||
|
|
||||||
qstring_append(body,
|
qstring_append(body,
|
||||||
/* the shaders leave the result in screen space, while
|
/* the shaders leave the result in screen space, while
|
||||||
|
@ -741,6 +743,16 @@ void vsh_translate(uint16_t version,
|
||||||
*/
|
*/
|
||||||
" oPos.x = 2.0 * (oPos.x - surfaceSize.x * 0.5) / surfaceSize.x;\n"
|
" oPos.x = 2.0 * (oPos.x - surfaceSize.x * 0.5) / surfaceSize.x;\n"
|
||||||
" oPos.y = -2.0 * (oPos.y - surfaceSize.y * 0.5) / surfaceSize.y;\n"
|
" oPos.y = -2.0 * (oPos.y - surfaceSize.y * 0.5) / surfaceSize.y;\n"
|
||||||
|
);
|
||||||
|
if (z_perspective) {
|
||||||
|
qstring_append(body, " oPos.z = oPos.w;\n");
|
||||||
|
}
|
||||||
|
qstring_append(body,
|
||||||
|
/* Map the clip range into clip space so z is clipped correctly.
|
||||||
|
* Note this makes the values in the depth buffer wrong. This should be
|
||||||
|
* handled with gl_ClipDistance instead, but that has performance issues
|
||||||
|
* on OS X.
|
||||||
|
*/
|
||||||
" if (clipRange.y != clipRange.x) {\n"
|
" if (clipRange.y != clipRange.x) {\n"
|
||||||
" oPos.z = (oPos.z - 0.5 * (clipRange.x + clipRange.y)) / (0.5 * (clipRange.y - clipRange.x));\n"
|
" oPos.z = (oPos.z - 0.5 * (clipRange.x + clipRange.y)) / (0.5 * (clipRange.y - clipRange.x));\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
@ -755,7 +767,6 @@ void vsh_translate(uint16_t version,
|
||||||
* can't multiply by W because it could be meaningless here */
|
* can't multiply by W because it could be meaningless here */
|
||||||
" oPos.w = 1.0;\n"
|
" oPos.w = 1.0;\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,7 @@ uint8_t vsh_get_field(const uint32_t *shader_token, VshFieldName field_name);
|
||||||
void vsh_translate(uint16_t version,
|
void vsh_translate(uint16_t version,
|
||||||
const uint32_t *tokens,
|
const uint32_t *tokens,
|
||||||
unsigned int length,
|
unsigned int length,
|
||||||
|
bool z_perspective,
|
||||||
QString *header, QString *body);
|
QString *header, QString *body);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue