chihiro.cpp: 3d accelerator update, better support for antialiasing\supersampling (nw)

This commit is contained in:
yz70s 2016-05-08 17:35:34 +02:00
parent e6bd4f678a
commit 6606503825
2 changed files with 635 additions and 596 deletions

View File

@ -210,15 +210,15 @@ public:
POLYGON = 10
};
enum class NV2A_VERTEX_ATTR {
POS = 0,
WEIGHT = 1,
NORMAL = 2,
POS = 0, // position
WEIGHT = 1, // blend weigth
NORMAL = 2,
COLOR0 = 3, // diffuse
COLOR1 = 4, // specular
FOG = 5,
BACKCOLOR0 = 7, // diffuse
BACKCOLOR1 = 8, // specular
TEX0 = 9,
BACKCOLOR0 = 7, // back diffuse
BACKCOLOR1 = 8, // back specular
TEX0 = 9, // texture coordinate
TEX1 = 10,
TEX2 = 11,
TEX3 = 12
@ -395,6 +395,8 @@ public:
blend_function_source = NV2A_BLEND_FACTOR::ONE;
logical_operation_enabled = false;
logical_operation = NV2A_LOGIC_OP::COPY;
for (int n = 0; n < 8; n++)
clippingwindows[n].set(0, 0, 640, 480);
limits_rendertarget.set(0, 0, 640, 480);
pitch_rendertarget = 0;
pitch_depthbuffer = 0;
@ -409,16 +411,20 @@ public:
clear_rendertarget.set(0, 0, 639, 479);
primitive_type = NV2A_BEGIN_END::STOP;
antialias_control = 0;
supersample_factor_x = 1.0;
supersample_factor_y = 1.0;
rendertarget = nullptr;
depthbuffer = nullptr;
displayedtarget = nullptr;
puller_channel = 0;
puller_waiting = 0;
debug_grab_texttype = -1;
debug_grab_textfile = nullptr;
waitvblank_used = 1;
memset(vertex_attribute_words, 0, sizeof(vertex_attribute_words));
memset(vertex_attribute_offset, 0, sizeof(vertex_attribute_offset));
memset(&persistvertexattr, 0, sizeof(persistvertexattr));
for (int n = 0; n < 16; n++)
persistvertexattr.attribute[n].fv[3] = 1;
}
DECLARE_READ32_MEMBER(geforce_r);
DECLARE_WRITE32_MEMBER(geforce_w);
@ -470,12 +476,15 @@ public:
void debug_grab_vertex_program_slot(int slot, UINT32 *instruction);
void start(address_space *cpu_space);
void savestate_items();
void compute_supersample_factors(float &horizontal, float &vertical);
void compute_limits_rendertarget(UINT32 chanel, UINT32 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 address, int limit);
int read_vertices_0x1808(address_space & space, vertex_nv *destination, UINT32 address, int limit);
int read_vertices_0x1810(address_space & space, vertex_nv *destination, int offset, int limit);
int read_vertices_0x1818(address_space & space, vertex_nv *destination, UINT32 address, int limit);
void convert_vertices_poly(vertex_nv *source, vertex_t *destination, int count);
void assemble_primitive(vertex_nv *source, int count, render_delegate &renderspans);
UINT32 render_triangle_culling(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &_v1, const vertex_t &_v2, const vertex_t &_v3);
void clear_render_target(int what, UINT32 value);
void clear_depth_buffer(int what, UINT32 value);
@ -488,6 +497,7 @@ public:
UINT32 objhandle;
UINT32 objclass;
UINT32 method[0x2000 / 4];
// int execute_method(address_space & space, UINT32 method, UINT32 address, int &countlen); // for the future
} object;
} channel[32][8];
UINT32 pfifo[0x2000 / 4];
@ -498,7 +508,9 @@ public:
UINT32 dma_offset[2];
UINT32 dma_size[2];
UINT8 *basemempointer;
UINT8 *topmempointer;
pic8259_device *interruptdevice;
rectangle clippingwindows[8];
rectangle limits_rendertarget;
UINT32 pitch_rendertarget;
UINT32 pitch_depthbuffer;
@ -512,6 +524,8 @@ public:
int bytespixel_rendertarget;
rectangle clear_rendertarget;
UINT32 antialias_control;
float supersample_factor_x;
float supersample_factor_y;
UINT32 *rendertarget;
UINT32 *depthbuffer;
UINT32 *displayedtarget;
@ -526,18 +540,35 @@ public:
int sizew;
int dilate;
NV2A_TEX_FORMAT format;
bool rectangle;
int rectangle_pitch;
void *buffer;
int dma0;
int dma1;
int cubic;
int noborder;
int dims;
int mipmap;
int colorkey;
int imagefield;
int aniso;
int mipmapmaxlod;
int mipmapminlod;
int rectheight;
int rectwidth;
} texture[4];
NV2A_BEGIN_END primitive_type;
int primitives_count;
UINT32 primitives_count;
int indexesleft_count;
int indexesleft_first;
UINT32 indexesleft[1024]; // vertex indices sent by the software to the 3d accelerator
int vertex_count;
unsigned int vertex_first;
int vertex_accumulated;
vertex_nv vertex_software[1024+2]; // vertex attributes sent by the software to the 3d accelerator
vertex_t vertex_xy[1024+2]; // vertex attributes computed by the 3d accelerator
vertex_nv persistvertexattr; // persistent vertex attributes
render_delegate render_spans_callback;
struct {
float variable_A[4]; // 0=R 1=G 2=B 3=A
@ -687,7 +718,6 @@ public:
int vertex_attribute_words[16];
int vertex_attribute_offset[16];
emu_timer *puller_timer;
int puller_channel;
int puller_waiting;
address_space *puller_space;
UINT32 dilated0[16][2048];

File diff suppressed because it is too large Load Diff