nv2a/glsl: Move clipRange value calc to helper func

This commit is contained in:
Matt Borgerson
2025-06-28 00:08:46 -07:00
parent 9025637010
commit 43618027e2
4 changed files with 30 additions and 39 deletions

View File

@ -18,6 +18,7 @@
*/
#include "common.h"
#include "hw/xbox/nv2a/pgraph/pgraph.h"
#define DECL_UNIFORM_ELEMENT_NAME(type) #type,
const char *uniform_element_type_to_str[] = {
@ -59,3 +60,26 @@ MString *pgraph_get_glsl_vtx_header(MString *out, bool location, bool smooth, bo
return out;
}
void pgraph_set_clip_range_uniform_value(PGRAPHState *pg, float clipRange[4])
{
float zmax;
switch (pg->surface_shape.zeta_format) {
case NV097_SET_SURFACE_FORMAT_ZETA_Z16:
zmax = pg->surface_shape.z_format ? f16_max : (float)0xFFFF;
break;
case NV097_SET_SURFACE_FORMAT_ZETA_Z24S8:
zmax = pg->surface_shape.z_format ? f24_max : (float)0xFFFFFF;
break;
default:
assert(0);
}
uint32_t zclip_min = pgraph_reg_r(pg, NV_PGRAPH_ZCLIPMIN);
uint32_t zclip_max = pgraph_reg_r(pg, NV_PGRAPH_ZCLIPMAX);
clipRange[0] = 0;
clipRange[1] = zmax;
clipRange[2] = *(float *)&zclip_min;
clipRange[3] = *(float *)&zclip_max;
}

View File

@ -97,4 +97,8 @@ typedef struct UniformInfo {
MString *pgraph_get_glsl_vtx_header(MString *out, bool location, bool smooth, bool in, bool prefix, bool array);
typedef struct PGRAPHState PGRAPHState;
void pgraph_set_clip_range_uniform_value(PGRAPHState *pg, float clipRange[4]);
#endif

View File

@ -1538,27 +1538,8 @@ void pgraph_set_psh_uniform_values(PGRAPHState *pg, const PshUniformLocs locs,
GET_MASK(fog_color, NV_PGRAPH_FOGCOLOR_ALPHA) / 255.0;
}
float zmax;
switch (pg->surface_shape.zeta_format) {
case NV097_SET_SURFACE_FORMAT_ZETA_Z16:
zmax = pg->surface_shape.z_format ? f16_max : (float)0xFFFF;
break;
case NV097_SET_SURFACE_FORMAT_ZETA_Z24S8:
zmax = pg->surface_shape.z_format ? f24_max : (float)0xFFFFFF;
break;
default:
assert(0);
}
if (locs[PshUniform_clipRange] != -1) {
uint32_t zclip_min = pgraph_reg_r(pg, NV_PGRAPH_ZCLIPMIN);
uint32_t zclip_max = pgraph_reg_r(pg, NV_PGRAPH_ZCLIPMAX);
values->clipRange[0][0] = 0;
values->clipRange[0][1] = zmax;
values->clipRange[0][2] = *(float *)&zclip_min;
values->clipRange[0][3] = *(float *)&zclip_max;
pgraph_set_clip_range_uniform_value(pg, values->clipRange[0]);
}
if (locs[PshUniform_depthOffset] != -1) {

View File

@ -486,25 +486,7 @@ void pgraph_set_vsh_uniform_values(PGRAPHState *pg, const VshState *state,
}
if (locs[VshUniform_clipRange] != -1) {
float zmax;
switch (pg->surface_shape.zeta_format) {
case NV097_SET_SURFACE_FORMAT_ZETA_Z16:
zmax = pg->surface_shape.z_format ? f16_max : (float)0xFFFF;
break;
case NV097_SET_SURFACE_FORMAT_ZETA_Z24S8:
zmax = pg->surface_shape.z_format ? f24_max : (float)0xFFFFFF;
break;
default:
assert(0);
}
uint32_t zclip_min = pgraph_reg_r(pg, NV_PGRAPH_ZCLIPMIN);
uint32_t zclip_max = pgraph_reg_r(pg, NV_PGRAPH_ZCLIPMAX);
values->clipRange[0][0] = 0;
values->clipRange[0][1] = zmax;
values->clipRange[0][2] = *(float *)&zclip_min;
values->clipRange[0][3] = *(float *)&zclip_max;
pgraph_set_clip_range_uniform_value(pg, values->clipRange[0]);
}
if (locs[VshUniform_fogParam] != -1) {