xbox: add some debug checks in graphics routines (nw)

This commit is contained in:
yz70s 2016-12-20 21:33:09 +01:00
parent 12d1f769c7
commit a2cc1606c3
2 changed files with 39 additions and 1 deletions

View File

@ -407,6 +407,8 @@ public:
limits_rendertarget.set(0, 0, 640, 480);
pitch_rendertarget = 0;
pitch_depthbuffer = 0;
size_rendertarget = 0;
size_depthbuffer = 0;
log2height_rendertarget = 0;
log2width_rendertarget = 0;
dilate_rendertarget = 0;
@ -485,6 +487,7 @@ public:
void savestate_items();
void compute_supersample_factors(float &horizontal, float &vertical);
void compute_limits_rendertarget(uint32_t chanel, uint32_t subchannel);
void compute_size_rendertarget(uint32_t chanel, uint32_t subchannel);
void read_vertex(address_space & space, offs_t address, vertex_nv &vertex, int attrib);
int read_vertices_0x1800(address_space & space, vertex_nv *destination, uint32_t address, int limit);
int read_vertices_0x1808(address_space & space, vertex_nv *destination, uint32_t address, int limit);
@ -523,6 +526,8 @@ public:
rectangle limits_rendertarget;
uint32_t pitch_rendertarget;
uint32_t pitch_depthbuffer;
uint32_t size_rendertarget;
uint32_t size_depthbuffer;
int log2height_rendertarget;
int log2width_rendertarget;
int dilate_rendertarget;

View File

@ -5,8 +5,10 @@
#include "bitmap.h"
#include "machine/pic8259.h"
#include "includes/xbox_nv2a.h"
#include <bitset>
//#define LOG_NV2A
#define DEBUG_CHECKS // enable for debugging
const char *vertex_program_disassembler::srctypes[] = { "??", "Rn", "Vn", "Cn" };
const char *vertex_program_disassembler::scaops[] = { "NOP", "IMV", "RCP", "RCC", "RSQ", "EXP", "LOG", "LIT", "???", "???", "???", "???", "???", "???", "???", "???", "???" };
@ -1267,6 +1269,13 @@ inline uint8_t *nv2a_renderer::read_pixel(int x, int y, int32_t c[4])
offset = (dilated0[dilate_rendertarget][x] + dilated1[dilate_rendertarget][y]) * bytespixel_rendertarget;
else // type_rendertarget == LINEAR
offset = pitch_rendertarget * y + x * bytespixel_rendertarget;
#ifdef DEBUG_CHECKS
if (offset >= size_rendertarget)
{
machine().logerror("Bad offset computed in read_pixel !\n");
offset = 0;
}
#endif
switch (colorformat_rendertarget) {
case NV2A_COLOR_FORMAT::R5G6B5:
addr16 = (uint16_t *)((uint8_t *)rendertarget + offset);
@ -1324,6 +1333,13 @@ void nv2a_renderer::write_pixel(int x, int y, uint32_t color, int depth)
if (color_mask != 0)
addr = read_pixel(x, y, fb);
if (depthformat_rendertarget == NV2A_RT_DEPTH_FORMAT::Z24S8) {
#ifdef DEBUG_CHECKS
if (((pitch_depthbuffer / 4) * y + x) >= size_depthbuffer)
{
machine().logerror("Bad depthbuffer offset computed in write_pixel !\n");
return;
}
#endif
daddr32 = depthbuffer + (pitch_depthbuffer / 4) * y + x;
deptsten = *daddr32;
dep = deptsten >> 8;
@ -1331,6 +1347,13 @@ void nv2a_renderer::write_pixel(int x, int y, uint32_t color, int depth)
daddr16 = nullptr;
}
else if (depthformat_rendertarget == NV2A_RT_DEPTH_FORMAT::Z16) {
#ifdef DEBUG_CHECKS
if (((pitch_depthbuffer / 2) * y + x) >= size_depthbuffer)
{
machine().logerror("Bad depthbuffer offset computed in write_pixel !\n");
return;
}
#endif
daddr16 = (uint16_t *)depthbuffer + (pitch_depthbuffer / 2) * y + x;
deptsten = *daddr16;
dep = (deptsten << 8) | 0xff;
@ -2900,6 +2923,12 @@ void nv2a_renderer::compute_limits_rendertarget(uint32_t chanel, uint32_t subcha
limits_rendertarget.sety(y, y + h - 1);
}
void nv2a_renderer::compute_size_rendertarget(uint32_t chanel, uint32_t subchannel)
{
size_rendertarget = pitch_rendertarget*(limits_rendertarget.bottom() + 1);
size_depthbuffer = pitch_depthbuffer*(limits_rendertarget.bottom() + 1);
}
int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, uint32_t subchannel, uint32_t method, uint32_t address, int &countlen)
{
uint32_t maddress;
@ -3068,7 +3097,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
}
if ((maddress >= 0x1980) && (maddress < 0x1a00))
{
int v = maddress - 0x1980; // 16 couples,4 values per couple
int v = maddress - 0x1980; // 16 couples,4 values per couple,16*2*4=128
int attr = v >> 3;
int comp = (v >> 1) & 2;
uint16_t d1 = data & 0xffff;
@ -3223,9 +3252,11 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
}
if (maddress == 0x0200) {
compute_limits_rendertarget(chanel, subchannel);
compute_size_rendertarget(chanel, subchannel);
}
if (maddress == 0x0204) {
compute_limits_rendertarget(chanel, subchannel);
compute_size_rendertarget(chanel, subchannel);
}
if (maddress == 0x0208) {
log2height_rendertarget = (data >> 24) & 255;
@ -3236,6 +3267,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
colorformat_rendertarget = (NV2A_COLOR_FORMAT)((data >> 0) & 15);
compute_supersample_factors(supersample_factor_x, supersample_factor_y);
compute_limits_rendertarget(chanel, subchannel);
compute_size_rendertarget(chanel, subchannel);
switch (colorformat_rendertarget) {
case NV2A_COLOR_FORMAT::R5G6B5:
bytespixel_rendertarget = 2;
@ -3258,6 +3290,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
if (maddress == 0x020c) {
pitch_rendertarget=data & 0xffff;
pitch_depthbuffer=(data >> 16) & 0xffff;
compute_size_rendertarget(chanel, subchannel);
#ifdef LOG_NV2A
printf("Pitch color %04X zbuffer %04X\n\r", pitch_rendertarget, pitch_depthbuffer);
#endif