summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/includes/chihiro.h
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2016-05-08 17:35:34 +0200
committer yz70s <yz70s@users.noreply.github.com>2016-05-08 17:37:13 +0200
commit66065038257b754a79387361cb981fa5ae90efc4 (patch)
tree4119d34859a89be5f26b76116399582f5334c5fe /src/mame/includes/chihiro.h
parente6bd4f678a3c134c5ccec2b0034e0073230e1466 (diff)
chihiro.cpp: 3d accelerator update, better support for antialiasing\supersampling (nw)
Diffstat (limited to 'src/mame/includes/chihiro.h')
-rw-r--r--src/mame/includes/chihiro.h48
1 files changed, 39 insertions, 9 deletions
diff --git a/src/mame/includes/chihiro.h b/src/mame/includes/chihiro.h
index 0a1915157c6..3705299c919 100644
--- a/src/mame/includes/chihiro.h
+++ b/src/mame/includes/chihiro.h
@@ -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];