|
|
|
@ -620,7 +620,7 @@ void GPU_HW::DispatchRenderCommand(RenderCommand rc, u32 num_vertices, const u32
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
texture_mode = m_render_state.texture_color_mode;
|
|
|
|
|
texture_mode = m_render_state.texture_mode;
|
|
|
|
|
if (rc.raw_texture_enable)
|
|
|
|
|
{
|
|
|
|
|
texture_mode =
|
|
|
|
@ -633,6 +633,35 @@ void GPU_HW::DispatchRenderCommand(RenderCommand rc, u32 num_vertices, const u32
|
|
|
|
|
texture_mode = TextureMode::Disabled;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// texture page changed - check that the new page doesn't intersect the drawing area
|
|
|
|
|
if (m_render_state.IsTexturePageChanged())
|
|
|
|
|
{
|
|
|
|
|
m_render_state.ClearTexturePageChangedFlag();
|
|
|
|
|
|
|
|
|
|
const u32 texture_page_left = m_render_state.texture_page_x;
|
|
|
|
|
const u32 texture_page_right = m_render_state.texture_page_y + TEXTURE_PAGE_WIDTH;
|
|
|
|
|
const u32 texture_page_top = m_render_state.texture_page_y;
|
|
|
|
|
const u32 texture_page_bottom = texture_page_top + TEXTURE_PAGE_HEIGHT;
|
|
|
|
|
const bool texture_page_overlaps =
|
|
|
|
|
(texture_page_left < m_drawing_area.right && texture_page_right > m_drawing_area.left &&
|
|
|
|
|
texture_page_top > m_drawing_area.bottom && texture_page_bottom < m_drawing_area.top);
|
|
|
|
|
const u32 texture_palette_left = m_render_state.texture_palette_x;
|
|
|
|
|
const u32 texture_palette_right = m_render_state.texture_palette_x + 256;
|
|
|
|
|
const bool texture_palette_overlaps =
|
|
|
|
|
m_render_state.IsUsingPalette() && texture_palette_left < m_drawing_area.right &&
|
|
|
|
|
texture_palette_right > m_drawing_area.left && m_render_state.texture_palette_y < m_drawing_area.bottom &&
|
|
|
|
|
m_render_state.texture_palette_y >= m_drawing_area.top;
|
|
|
|
|
|
|
|
|
|
// we only need to update the copy texture if the render area intersects with the texture page
|
|
|
|
|
if (texture_page_overlaps || texture_palette_overlaps)
|
|
|
|
|
{
|
|
|
|
|
Log_WarningPrintf("Invalidating VRAM read cache due to drawing area overlap");
|
|
|
|
|
if (!IsFlushed())
|
|
|
|
|
FlushRender();
|
|
|
|
|
InvalidateVRAMReadCache();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// has any state changed which requires a new batch?
|
|
|
|
|
const TransparencyMode transparency_mode =
|
|
|
|
|
rc.transparency_enable ? m_render_state.transparency_mode : TransparencyMode::Disabled;
|
|
|
|
@ -644,8 +673,7 @@ void GPU_HW::DispatchRenderCommand(RenderCommand rc, u32 num_vertices, const u32
|
|
|
|
|
const bool buffer_overflow = GetBatchVertexSpace() < max_added_vertices;
|
|
|
|
|
if (buffer_overflow || rc_primitive == HWPrimitive::LineStrip || m_batch.texture_mode != texture_mode ||
|
|
|
|
|
m_batch.transparency_mode != transparency_mode || m_batch.primitive != rc_primitive ||
|
|
|
|
|
dithering_enable != m_batch.dithering || m_render_state.IsTexturePageChanged() ||
|
|
|
|
|
m_render_state.IsTextureWindowChanged())
|
|
|
|
|
dithering_enable != m_batch.dithering || m_render_state.IsTextureWindowChanged())
|
|
|
|
|
{
|
|
|
|
|
FlushRender();
|
|
|
|
|
}
|
|
|
|
@ -661,31 +689,6 @@ void GPU_HW::DispatchRenderCommand(RenderCommand rc, u32 num_vertices, const u32
|
|
|
|
|
m_batch.transparency_mode = transparency_mode;
|
|
|
|
|
m_batch.dithering = dithering_enable;
|
|
|
|
|
|
|
|
|
|
if (m_render_state.IsTexturePageChanged())
|
|
|
|
|
{
|
|
|
|
|
// we only need to update the copy texture if the render area intersects with the texture page
|
|
|
|
|
const u32 texture_page_left = m_render_state.texture_page_x;
|
|
|
|
|
const u32 texture_page_right = m_render_state.texture_page_y + TEXTURE_PAGE_WIDTH;
|
|
|
|
|
const u32 texture_page_top = m_render_state.texture_page_y;
|
|
|
|
|
const u32 texture_page_bottom = texture_page_top + TEXTURE_PAGE_HEIGHT;
|
|
|
|
|
const bool texture_page_overlaps =
|
|
|
|
|
(texture_page_left < m_drawing_area.right && texture_page_right > m_drawing_area.left &&
|
|
|
|
|
texture_page_top > m_drawing_area.bottom && texture_page_bottom < m_drawing_area.top);
|
|
|
|
|
|
|
|
|
|
// TODO: Check palette too.
|
|
|
|
|
if (texture_page_overlaps)
|
|
|
|
|
{
|
|
|
|
|
Log_DebugPrintf("Invalidating VRAM read cache due to drawing area overlap");
|
|
|
|
|
InvalidateVRAMReadCache();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_batch.texture_page_x = m_render_state.texture_page_x;
|
|
|
|
|
m_batch.texture_page_y = m_render_state.texture_page_y;
|
|
|
|
|
m_batch.texture_palette_x = m_render_state.texture_palette_x;
|
|
|
|
|
m_batch.texture_palette_y = m_render_state.texture_palette_y;
|
|
|
|
|
m_render_state.ClearTexturePageChangedFlag();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_render_state.IsTextureWindowChanged())
|
|
|
|
|
{
|
|
|
|
|
m_batch.texture_window_values[0] = m_render_state.texture_window_mask_x;
|
|
|
|
|