From 02344f90487cff0bb9842faa8bfe167e27a590d7 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sun, 29 May 2011 23:58:04 +0200 Subject: [PATCH] Bitmasking. --- gfx/shader_cg.c | 7 +++++++ gfx/shader_glsl.c | 8 ++++++++ gfx/snes_state.c | 20 +++++++++++++------- gfx/snes_state.h | 1 + 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gfx/shader_cg.c b/gfx/shader_cg.c index bb8a112fdb..d6219a4a63 100644 --- a/gfx/shader_cg.c +++ b/gfx/shader_cg.c @@ -394,6 +394,7 @@ static bool load_imports(config_file_t *conf) char oam_buf[64]; char cgram_buf[64]; char vram_buf[64]; + char mask_buf[64]; print_buf(semantic_buf, "%s_semantic", id); print_buf(wram_buf, "%s_wram", id); @@ -401,6 +402,7 @@ static bool load_imports(config_file_t *conf) print_buf(oam_buf, "%s_oam", id); print_buf(cgram_buf, "%s_cgram", id); print_buf(vram_buf, "%s_vram", id); + print_buf(mask_buf, "%s_mask", id); char *semantic = NULL; @@ -474,10 +476,15 @@ static bool load_imports(config_file_t *conf) goto error; } + unsigned bitmask = 0; + if (!config_get_hex(conf, mask_buf, &bitmask)) + bitmask = 0; + strlcpy(info[info_cnt].id, id, sizeof(info[info_cnt].id)); info[info_cnt].addr = addr; info[info_cnt].type = tracker_type; info[info_cnt].ram_type = ram_type; + info[info_cnt].mask = bitmask; info_cnt++; free(semantic); diff --git a/gfx/shader_glsl.c b/gfx/shader_glsl.c index 5f27c20c17..15442447ce 100644 --- a/gfx/shader_glsl.c +++ b/gfx/shader_glsl.c @@ -393,6 +393,7 @@ static bool get_import_value(xmlNodePtr ptr) xmlChar *vram = xmlGetProp(ptr, (const xmlChar*)"vram"); xmlChar *oam = xmlGetProp(ptr, (const xmlChar*)"oam"); xmlChar *cgram = xmlGetProp(ptr, (const xmlChar*)"cgram"); + xmlChar *bitmask = xmlGetProp(ptr, (const xmlChar*)"mask"); if (!semantic || !id) { @@ -457,10 +458,15 @@ static bool get_import_value(xmlNodePtr ptr) goto error; } + unsigned mask_value = 0; + if (bitmask) + mask_value = strtoul((const char*)bitmask, NULL, 16); + strlcpy(gl_tracker_info[gl_tracker_info_cnt].id, (const char*)id, sizeof(gl_tracker_info[0].id)); gl_tracker_info[gl_tracker_info_cnt].addr = addr; gl_tracker_info[gl_tracker_info_cnt].type = tracker_type; gl_tracker_info[gl_tracker_info_cnt].ram_type = ram_type; + gl_tracker_info[gl_tracker_info_cnt].mask = mask_value; gl_tracker_info_cnt++; if (id) xmlFree(id); @@ -470,6 +476,7 @@ static bool get_import_value(xmlNodePtr ptr) if (vram) xmlFree(vram); if (oam) xmlFree(oam); if (cgram) xmlFree(cgram); + if (bitmask) xmlFree(bitmask); return true; error: @@ -480,6 +487,7 @@ error: if (vram) xmlFree(vram); if (oam) xmlFree(oam); if (cgram) xmlFree(cgram); + if (bitmask) xmlFree(bitmask); return false; } diff --git a/gfx/snes_state.c b/gfx/snes_state.c index ceedd2af26..79b1be43e5 100644 --- a/gfx/snes_state.c +++ b/gfx/snes_state.c @@ -26,6 +26,7 @@ struct snes_tracker_internal const uint8_t *ptr; uint32_t addr; + uint8_t mask; enum snes_tracker_type type; @@ -54,6 +55,7 @@ snes_tracker_t* snes_tracker_init(const struct snes_tracker_info *info) strlcpy(tracker->info[i].id, info->info[i].id, sizeof(tracker->info[i].id)); tracker->info[i].addr = info->info[i].addr; tracker->info[i].type = info->info[i].type; + tracker->info[i].mask = (info->info[i].mask == 0) ? 0xff : info->info[i].mask; assert(info->wram && info->vram && info->cgram && info->oam && info->apuram); @@ -91,6 +93,8 @@ void snes_tracker_free(snes_tracker_t *tracker) free(tracker); } +#define fetch(addr) (info->ptr[info->addr] & info->mask) + static void update_element( struct snes_tracker_uniform *uniform, struct snes_tracker_internal *info, @@ -101,22 +105,22 @@ static void update_element( switch (info->type) { case SSNES_STATE_CAPTURE: - uniform->value = info->ptr[info->addr]; + uniform->value = fetch(addr); break; case SSNES_STATE_CAPTURE_PREV: - if (info->prev[0] != info->ptr[info->addr]) + if (info->prev[0] != fetch(addr)) { info->prev[1] = info->prev[0]; - info->prev[0] = info->ptr[info->addr]; + info->prev[0] = fetch(addr); } uniform->value = info->prev[1]; break; case SSNES_STATE_TRANSITION: - if (info->old_value != info->ptr[info->addr]) + if (info->old_value != fetch(addr)) { - info->old_value = info->ptr[info->addr]; + info->old_value = fetch(addr); info->frame_count = frame_count; } uniform->value = info->frame_count; @@ -124,9 +128,9 @@ static void update_element( break; case SSNES_STATE_TRANSITION_PREV: - if (info->prev[0] != info->ptr[info->addr]) + if (info->prev[0] != fetch(addr)) { - info->old_value = info->ptr[info->addr]; + info->old_value = fetch(addr); info->prev[1] = info->prev[0]; info->prev[0] = frame_count; info->frame_count = frame_count; @@ -140,6 +144,8 @@ static void update_element( } } +#undef fetch + unsigned snes_get_uniform(snes_tracker_t *tracker, struct snes_tracker_uniform *uniforms, unsigned elem, unsigned frame_count) { unsigned elems = tracker->info_elem < elem ? tracker->info_elem : elem; diff --git a/gfx/snes_state.h b/gfx/snes_state.h index 93179af188..37efb06e13 100644 --- a/gfx/snes_state.h +++ b/gfx/snes_state.h @@ -43,6 +43,7 @@ struct snes_tracker_uniform_info uint32_t addr; enum snes_tracker_type type; enum snes_ram_type ram_type; + uint8_t mask; }; struct snes_tracker_info