summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2015-12-13 11:15:16 +0100
committer yz70s <yz70s@users.noreply.github.com>2015-12-13 11:55:36 +0100
commit569835dff9c3fef83c095e08fee73ce170cce86b (patch)
tree7ba34deeb696d40b3cd2a1b9b5b50a5ade67ce17 /src/mame
parent408edf4f7782457b763305b7a565df45452a8916 (diff)
chihiro.cpp: clear render target color buffer supports subregion and single channel (nw)
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/includes/chihiro.h3
-rw-r--r--src/mame/video/chihiro.cpp160
2 files changed, 132 insertions, 31 deletions
diff --git a/src/mame/includes/chihiro.h b/src/mame/includes/chihiro.h
index fe8f74fde5e..c0d3cab2dbc 100644
--- a/src/mame/includes/chihiro.h
+++ b/src/mame/includes/chihiro.h
@@ -393,6 +393,7 @@ public:
depthformat_rendertarget = NV2A_RT_DEPTH_FORMAT::Z24S8;
colorformat_rendertarget = NV2A_COLOR_FORMAT::A8R8G8B8;
bytespixel_rendertarget = 4;
+ clear_rendertarget.set(0, 0, 639, 479);
antialias_control = 0;
rendertarget = nullptr;
depthbuffer = nullptr;
@@ -462,6 +463,7 @@ public:
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 clear_render_target(int what, UINT32 value);
void clear_depth_buffer(int what, UINT32 value);
inline UINT8 *direct_access_ptr(offs_t address);
TIMER_CALLBACK_MEMBER(puller_timer_work);
@@ -494,6 +496,7 @@ public:
NV2A_RT_DEPTH_FORMAT depthformat_rendertarget;
NV2A_COLOR_FORMAT colorformat_rendertarget;
int bytespixel_rendertarget;
+ rectangle clear_rendertarget;
UINT32 antialias_control;
UINT32 *rendertarget;
UINT32 *depthbuffer;
diff --git a/src/mame/video/chihiro.cpp b/src/mame/video/chihiro.cpp
index 3826afa828f..d05e7bb5a24 100644
--- a/src/mame/video/chihiro.cpp
+++ b/src/mame/video/chihiro.cpp
@@ -1250,7 +1250,7 @@ inline UINT8 *nv2a_renderer::read_pixel(int x, int y, INT32 c[4])
if (type_rendertarget == NV2A_RT_TYPE::SWIZZLED)
offset = (dilated0[dilate_rendertarget][x] + dilated1[dilate_rendertarget][y]) * bytespixel_rendertarget;
- else // type_rendertarget == LINEAR*/
+ else // type_rendertarget == LINEAR
offset = pitch_rendertarget * y + x * bytespixel_rendertarget;
switch (colorformat_rendertarget) {
case NV2A_COLOR_FORMAT::R5G6B5:
@@ -2335,6 +2335,123 @@ void nv2a_renderer::convert_vertices_poly(vertex_nv *source, vertex_t *destinati
}
}
+void nv2a_renderer::clear_render_target(int what, UINT32 value)
+{
+ int m;
+ int xi, yi, xf, yf;
+ int x, y;
+ UINT32 color;
+ UINT8 *addr;
+ UINT32 mask;
+ UINT32 offset;
+
+ if (what == 0)
+ return;
+ mask = 0;
+ switch (colorformat_rendertarget) {
+ case NV2A_COLOR_FORMAT::R5G6B5:
+ if (what & 1)
+ mask = 0x1f;
+ if (what & 2)
+ mask = mask | 0x07e0;
+ if (what & 4)
+ mask = mask | 0xf800;
+ break;
+ case NV2A_COLOR_FORMAT::X8R8G8B8_Z8R8G8B8:
+ case NV2A_COLOR_FORMAT::X8R8G8B8_X8R8G8B8:
+ for (x = 3; x >= 0; x--) {
+ if (what & 8)
+ mask = (mask << 8) | 255;
+ what = what << 1;
+ }
+ break;
+ case NV2A_COLOR_FORMAT::A8R8G8B8:
+ for (x = 3; x >= 0; x--) {
+ if (what & 8)
+ mask = (mask << 8) | 255;
+ what = what << 1;
+ }
+ break;
+ case NV2A_COLOR_FORMAT::B8:
+ if (what & 1)
+ mask = 255;
+ break;
+ default:
+ return;
+ }
+ m = antialias_control;
+ if (antialiasing_rendertarget != 0)
+ m = 2;
+ else
+ m = 1;
+ xi = limits_rendertarget.left();
+ if (clear_rendertarget.left() > xi)
+ xi = clear_rendertarget.left();
+ xf = limits_rendertarget.right();
+ if (clear_rendertarget.right() < xf)
+ xf = clear_rendertarget.right();
+ yi = limits_rendertarget.top();
+ if (clear_rendertarget.top() > yi)
+ yi = clear_rendertarget.top();
+ yf = limits_rendertarget.bottom();
+ if (clear_rendertarget.bottom() < yf)
+ yf = clear_rendertarget.bottom();
+ xi = xi*m;
+ yi = yi*m;
+ xf = xf*m;
+ yf = yf*m;
+ for (y = yi; y <= yf; y++)
+ for (x = xi; x <= xf; x++) {
+ if (type_rendertarget == NV2A_RT_TYPE::SWIZZLED)
+ offset = (dilated0[dilate_rendertarget][x] + dilated1[dilate_rendertarget][y]) * bytespixel_rendertarget;
+ else // type_rendertarget == LINEAR
+ offset = pitch_rendertarget * y + x * bytespixel_rendertarget;
+ switch (colorformat_rendertarget) {
+ case NV2A_COLOR_FORMAT::R5G6B5:
+ addr = (UINT8 *)rendertarget + offset;
+ color = *((UINT16 *)addr);
+ break;
+ case NV2A_COLOR_FORMAT::X8R8G8B8_Z8R8G8B8:
+ case NV2A_COLOR_FORMAT::X8R8G8B8_X8R8G8B8:
+ addr = (UINT8 *)rendertarget + offset;
+ color = *((UINT32 *)addr);
+ break;
+ case NV2A_COLOR_FORMAT::A8R8G8B8:
+ addr = (UINT8 *)rendertarget + offset;
+ color = *((UINT32 *)addr);
+ break;
+ case NV2A_COLOR_FORMAT::B8:
+ addr = (UINT8 *)rendertarget + offset;
+ color = *addr;
+ break;
+ default:
+ return;
+ }
+ color = (color & ~mask) | (value & mask);
+ switch (colorformat_rendertarget) {
+ case NV2A_COLOR_FORMAT::R5G6B5:
+ *((UINT16 *)addr) = color;
+ break;
+ case NV2A_COLOR_FORMAT::X8R8G8B8_Z8R8G8B8:
+ case NV2A_COLOR_FORMAT::X8R8G8B8_X8R8G8B8:
+ *((UINT32 *)addr) = color;
+ break;
+ case NV2A_COLOR_FORMAT::A8R8G8B8:
+ *((UINT32 *)addr) = color;
+ break;
+ case NV2A_COLOR_FORMAT::B8:
+ *addr = color;
+ break;
+ default:
+ return;
+ }
+
+ }
+#ifdef LOG_NV2A
+ printf("clearscreen\n\r");
+#endif
+}
+
void nv2a_renderer::clear_depth_buffer(int what, UINT32 value)
{
int m;
@@ -2853,44 +2970,25 @@ int nv2a_renderer::geforce_exec_method(address_space & space, UINT32 chanel, UIN
countlen--;
}
if (maddress == 0x1d98) {
+ int x, w;
+
+ x = data & 0xffff;
+ w = (data >> 16) & 0xffff;
+ clear_rendertarget.setx(x, w);
countlen--;
}
if (maddress == 0x1d9c) {
+ int y, h;
+
+ y = data & 0xffff;
+ h = (data >> 16) & 0xffff;
+ clear_rendertarget.sety(y, h);
countlen--;
}
if (maddress == 0x1d94) {
- int m;
-
- m = antialias_control;
- if (antialiasing_rendertarget != 0)
- m = 2;
- else
- m = 1;
// possible buffers: color, depth, stencil
// clear framebuffer
- if ((data & 0xf0) == 0xf0) {
- if (bytespixel_rendertarget == 4) {
- bitmap_rgb32 bm(rendertarget, (limits_rendertarget.right() + 1) * m, (limits_rendertarget.bottom() + 1) * m, pitch_rendertarget / 4);
-
- UINT32 color = channel[chanel][subchannel].object.method[0x1d90 / 4];
- bm.fill(color);
- }
- else if (bytespixel_rendertarget == 2) {
- bitmap_ind16 bm((UINT16 *)rendertarget, (limits_rendertarget.right() + 1) * m, (limits_rendertarget.bottom() + 1) * m, pitch_rendertarget / 2);
-
- UINT16 color = channel[chanel][subchannel].object.method[0x1d90 / 4] & 0xffff;
-
- bm.fill(color);
- }
- else if (bytespixel_rendertarget == 1) {
- UINT8 color = channel[chanel][subchannel].object.method[0x1d90 / 4] & 0xff;
-
- memset(rendertarget, color, pitch_rendertarget*(limits_rendertarget.bottom() + 1) * m);
- }
-#ifdef LOG_NV2A
- printf("clearscreen\n\r");
-#endif
- }
+ clear_render_target((data >> 4) & 15, channel[chanel][subchannel].object.method[0x1d90 / 4]);
clear_depth_buffer(data & 3, channel[chanel][subchannel].object.method[0x1d8c / 4]);
countlen--;
}