mirror of https://github.com/xemu-project/xemu.git
nv2a: Handles depth borders in 3D bordered textures
3D textures with texture borders have 4 layers of border on either side of the content layers in addition to the normal 4 pixel border per layer. This change handles those extra depth layers in roughly the same way that the per-layer border texels are handled. Fixes #1171 [Test](https://github.com/abaire/nxdk_pgraph_tests/blob/main/src/tests/texture_border_tests.cpp) [HW results](https://github.com/abaire/nxdk_pgraph_tests_golden_results/wiki/Results-Texture_border)
This commit is contained in:
parent
248fc788c1
commit
c83b53e09d
|
@ -4568,6 +4568,7 @@ static void pgraph_bind_shaders(PGRAPHState *pg)
|
||||||
bool cubemap = GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_CUBEMAPENABLE);
|
bool cubemap = GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_CUBEMAPENABLE);
|
||||||
state.psh.border_logical_size[i][0] = 0.0f;
|
state.psh.border_logical_size[i][0] = 0.0f;
|
||||||
state.psh.border_logical_size[i][1] = 0.0f;
|
state.psh.border_logical_size[i][1] = 0.0f;
|
||||||
|
state.psh.border_logical_size[i][2] = 0.0f;
|
||||||
if (border_source != NV_PGRAPH_TEXFMT0_BORDER_SOURCE_COLOR) {
|
if (border_source != NV_PGRAPH_TEXFMT0_BORDER_SOURCE_COLOR) {
|
||||||
if (!f.linear && !cubemap) {
|
if (!f.linear && !cubemap) {
|
||||||
// The actual texture will be (at least) double the reported
|
// The actual texture will be (at least) double the reported
|
||||||
|
@ -4577,8 +4578,13 @@ static void pgraph_bind_shaders(PGRAPHState *pg)
|
||||||
1 << GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_BASE_SIZE_U);
|
1 << GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_BASE_SIZE_U);
|
||||||
unsigned int reported_height =
|
unsigned int reported_height =
|
||||||
1 << GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_BASE_SIZE_V);
|
1 << GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_BASE_SIZE_V);
|
||||||
|
unsigned int reported_depth =
|
||||||
|
1 << GET_MASK(tex_fmt, NV_PGRAPH_TEXFMT0_BASE_SIZE_P);
|
||||||
|
|
||||||
state.psh.border_logical_size[i][0] = reported_width;
|
state.psh.border_logical_size[i][0] = reported_width;
|
||||||
state.psh.border_logical_size[i][1] = reported_height;
|
state.psh.border_logical_size[i][1] = reported_height;
|
||||||
|
state.psh.border_logical_size[i][2] = reported_depth;
|
||||||
|
|
||||||
if (reported_width < 8) {
|
if (reported_width < 8) {
|
||||||
state.psh.border_inv_real_size[i][0] = 0.0625f;
|
state.psh.border_inv_real_size[i][0] = 0.0625f;
|
||||||
} else {
|
} else {
|
||||||
|
@ -4591,6 +4597,12 @@ static void pgraph_bind_shaders(PGRAPHState *pg)
|
||||||
state.psh.border_inv_real_size[i][1] =
|
state.psh.border_inv_real_size[i][1] =
|
||||||
1.0f / (reported_height * 2.0f);
|
1.0f / (reported_height * 2.0f);
|
||||||
}
|
}
|
||||||
|
if (reported_depth < 8) {
|
||||||
|
state.psh.border_inv_real_size[i][2] = 0.0625f;
|
||||||
|
} else {
|
||||||
|
state.psh.border_inv_real_size[i][2] =
|
||||||
|
1.0f / (reported_depth * 2.0f);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
NV2A_UNIMPLEMENTED("Border source texture with linear %d cubemap %d",
|
NV2A_UNIMPLEMENTED("Border source texture with linear %d cubemap %d",
|
||||||
f.linear, cubemap);
|
f.linear, cubemap);
|
||||||
|
@ -7214,10 +7226,12 @@ static void upload_gl_texture(GLenum gl_target,
|
||||||
unsigned int adjusted_width = s.width;
|
unsigned int adjusted_width = s.width;
|
||||||
unsigned int adjusted_height = s.height;
|
unsigned int adjusted_height = s.height;
|
||||||
unsigned int adjusted_pitch = s.pitch;
|
unsigned int adjusted_pitch = s.pitch;
|
||||||
|
unsigned int adjusted_depth = s.depth;
|
||||||
if (!f.linear && s.border) {
|
if (!f.linear && s.border) {
|
||||||
adjusted_width = MAX(16, adjusted_width * 2);
|
adjusted_width = MAX(16, adjusted_width * 2);
|
||||||
adjusted_height = MAX(16, adjusted_height * 2);
|
adjusted_height = MAX(16, adjusted_height * 2);
|
||||||
adjusted_pitch = adjusted_width * (s.pitch / s.width);
|
adjusted_pitch = adjusted_width * (s.pitch / s.width);
|
||||||
|
adjusted_depth = MAX(16, s.depth * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(gl_target) {
|
switch(gl_target) {
|
||||||
|
@ -7353,7 +7367,7 @@ static void upload_gl_texture(GLenum gl_target,
|
||||||
|
|
||||||
unsigned int width = adjusted_width;
|
unsigned int width = adjusted_width;
|
||||||
unsigned int height = adjusted_height;
|
unsigned int height = adjusted_height;
|
||||||
unsigned int depth = s.depth;
|
unsigned int depth = adjusted_depth;
|
||||||
|
|
||||||
assert(f.linear == false);
|
assert(f.linear == false);
|
||||||
|
|
||||||
|
|
|
@ -679,10 +679,10 @@ static void apply_border_adjustment(const struct PixelShader *ps, MString *vars,
|
||||||
|
|
||||||
mstring_append_fmt(
|
mstring_append_fmt(
|
||||||
vars,
|
vars,
|
||||||
"vec2 t%dLogicalSize = vec2(%f, %f);\n"
|
"vec3 t%dLogicalSize = vec3(%f, %f, %f);\n"
|
||||||
"%s.xy = (%s.xy * t%dLogicalSize + vec2(4, 4)) * vec2(%f, %f);\n",
|
"%s.xyz = (%s.xyz * t%dLogicalSize + vec3(4, 4, 4)) * vec3(%f, %f, %f);\n",
|
||||||
i, ps->state.border_logical_size[i][0], ps->state.border_logical_size[i][1],
|
i, ps->state.border_logical_size[i][0], ps->state.border_logical_size[i][1], ps->state.border_logical_size[i][2],
|
||||||
var_name, var_name, i, ps->state.border_inv_real_size[i][0], ps->state.border_inv_real_size[i][1]);
|
var_name, var_name, i, ps->state.border_inv_real_size[i][0], ps->state.border_inv_real_size[i][1], ps->state.border_inv_real_size[i][2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MString* psh_convert(struct PixelShader *ps)
|
static MString* psh_convert(struct PixelShader *ps)
|
||||||
|
|
|
@ -68,8 +68,8 @@ typedef struct PshState {
|
||||||
bool alphakill[4];
|
bool alphakill[4];
|
||||||
enum ConvolutionFilter conv_tex[4];
|
enum ConvolutionFilter conv_tex[4];
|
||||||
|
|
||||||
float border_logical_size[4][2];
|
float border_logical_size[4][3];
|
||||||
float border_inv_real_size[4][2];
|
float border_inv_real_size[4][3];
|
||||||
|
|
||||||
bool shadow_map[4];
|
bool shadow_map[4];
|
||||||
enum PshShadowDepthFunc shadow_depth_func;
|
enum PshShadowDepthFunc shadow_depth_func;
|
||||||
|
|
Loading…
Reference in New Issue