diff options
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 |
commit | 569835dff9c3fef83c095e08fee73ce170cce86b (patch) | |
tree | 7ba34deeb696d40b3cd2a1b9b5b50a5ade67ce17 /src/mame | |
parent | 408edf4f7782457b763305b7a565df45452a8916 (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.h | 3 | ||||
-rw-r--r-- | src/mame/video/chihiro.cpp | 160 |
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--; } |