honor the pcw over the isp/tsp instruction word for uv_16bit, gouraud, offset and texture settings

This commit is contained in:
Anthony Pesch 2017-10-19 20:56:33 -04:00
parent 747fddb805
commit f6dbdbcd02
3 changed files with 22 additions and 18 deletions

View File

@ -70,7 +70,7 @@ union isp {
uint32_t dcalc_ctrl : 1;
uint32_t cache_bypass : 1;
uint32_t uv_16bit : 1;
uint32_t gouraud_shading : 1;
uint32_t gouraud : 1;
uint32_t offset : 1;
uint32_t texture : 1;
uint32_t z_write_disable : 1;
@ -134,7 +134,7 @@ union tcw {
union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
union tsp tsp;
union tcw tcw;
uint32_t ignore_0;
@ -145,7 +145,7 @@ union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
union tsp tsp;
union tcw tcw;
float face_color_a;
@ -156,7 +156,7 @@ union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
union tsp tsp;
union tcw tcw;
uint32_t ignore_0;
@ -175,7 +175,7 @@ union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
union tsp tsp0;
union tcw tcw0;
union tsp tsp1;
@ -186,7 +186,7 @@ union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
union tsp tsp0;
union tcw tcw0;
union tsp tsp1;
@ -205,7 +205,7 @@ union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
union tsp tsp;
union tcw tcw;
uint32_t base_color;
@ -216,7 +216,7 @@ union poly_param {
struct {
union pcw pcw;
union isp isp_tsp;
union isp isp;
uint32_t reserved[6];
} modvol;
};

View File

@ -21,11 +21,12 @@ struct tr {
const union vert_param *last_vertex;
int list_type;
int vert_type;
/* poly params */
uint8_t face_color[4];
uint8_t face_offset_color[4];
/* sprite params */
uint8_t sprite_color[4];
uint8_t sprite_offset_color[4];
int merged_surfs;
};
static int compressed_mipmap_offsets[] = {
@ -292,8 +293,6 @@ static void tr_commit_surf(struct tr *tr, struct tr_context *rc) {
if (prev_surf && tr_can_merge_surfs(prev_surf, new_surf)) {
/* merge the new verts into the prev surface */
prev_surf->num_verts += new_surf->num_verts;
tr->merged_surfs++;
} else {
/* default sort the new surface */
struct tr_list *list = &rc->lists[tr->list_type];
@ -458,18 +457,22 @@ static void tr_parse_poly_param(struct tr *tr, const struct ta_context *ctx,
break;
}
/* setup the new surface */
/* setup the new surface
note, bits 0-3 of the global pcw override the respective bits in the global
isp/tsp instruction word, so use the pcw for the uv_16bit, gouraud, offset,
and texture settings */
struct ta_surface *surf = tr_reserve_surf(tr, rc, 0);
surf->depth_write = !param->type0.isp_tsp.z_write_disable;
surf->depth_write = !param->type0.isp.z_write_disable;
surf->depth_func =
translate_depth_func(param->type0.isp_tsp.depth_compare_mode);
surf->cull = translate_cull(param->type0.isp_tsp.culling_mode);
translate_depth_func(param->type0.isp.depth_compare_mode);
surf->cull = translate_cull(param->type0.isp.culling_mode);
surf->src_blend = translate_src_blend_func(param->type0.tsp.src_alpha_instr);
surf->dst_blend = translate_dst_blend_func(param->type0.tsp.dst_alpha_instr);
surf->shade = translate_shade_mode(param->type0.tsp.texture_shading_instr);
surf->ignore_alpha = !param->type0.tsp.use_alpha;
surf->ignore_texture_alpha = param->type0.tsp.ignore_tex_alpha;
surf->offset_color = param->type0.isp_tsp.offset;
surf->offset_color = param->type0.pcw.offset;
surf->pt_alpha_test = tr->list_type == TA_LIST_PUNCH_THROUGH;
surf->pt_alpha_ref = (float)ctx->pt_alpha_ref / 0xff;
@ -722,7 +725,8 @@ static void tr_reset(struct tr *tr, struct tr_context *rc) {
tr->vert_type = TA_NUM_VERTS;
memset(tr->face_color, 0, sizeof(tr->face_color));
memset(tr->face_offset_color, 0, sizeof(tr->face_offset_color));
tr->merged_surfs = 0;
memset(tr->sprite_color, 0, sizeof(tr->sprite_color));
memset(tr->sprite_offset_color, 0, sizeof(tr->sprite_offset_color));
/* reset render context state */
rc->num_params = 0;

View File

@ -358,7 +358,7 @@ static void tracer_param_tooltip(struct tracer *tracer, struct tr_param *rp) {
const union poly_param *param =
(const union poly_param *)(tracer->ctx.params + rp->offset);
igText("isp_tsp: 0x%x", param->type0.isp_tsp.full);
igText("isp: 0x%x", param->type0.isp.full);
igText("tsp: 0x%x", param->type0.tsp.full);
igText("tcw: 0x%x", param->type0.tcw.full);