mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-04-29 06:05:41 -04:00
GPU: Precompute texture window expression [SAVEVERSION+]
This commit is contained in:
parent
f761f1550f
commit
cacf7a7cc9
@ -95,6 +95,7 @@ void GPU::SoftReset()
|
|||||||
m_fifo.Clear();
|
m_fifo.Clear();
|
||||||
m_blit_buffer.clear();
|
m_blit_buffer.clear();
|
||||||
m_blit_remaining_words = 0;
|
m_blit_remaining_words = 0;
|
||||||
|
m_draw_mode.texture_window_value = 0xFFFFFFFFu;
|
||||||
SetDrawMode(0);
|
SetDrawMode(0);
|
||||||
SetTexturePalette(0);
|
SetTexturePalette(0);
|
||||||
SetTextureWindow(0);
|
SetTextureWindow(0);
|
||||||
@ -121,10 +122,10 @@ bool GPU::DoState(StateWrapper& sw)
|
|||||||
sw.Do(&m_draw_mode.texture_page_y);
|
sw.Do(&m_draw_mode.texture_page_y);
|
||||||
sw.Do(&m_draw_mode.texture_palette_x);
|
sw.Do(&m_draw_mode.texture_palette_x);
|
||||||
sw.Do(&m_draw_mode.texture_palette_y);
|
sw.Do(&m_draw_mode.texture_palette_y);
|
||||||
sw.Do(&m_draw_mode.texture_window_mask_x);
|
sw.Do(&m_draw_mode.texture_window_and_x);
|
||||||
sw.Do(&m_draw_mode.texture_window_mask_y);
|
sw.Do(&m_draw_mode.texture_window_and_y);
|
||||||
sw.Do(&m_draw_mode.texture_window_offset_x);
|
sw.Do(&m_draw_mode.texture_window_or_x);
|
||||||
sw.Do(&m_draw_mode.texture_window_offset_y);
|
sw.Do(&m_draw_mode.texture_window_or_y);
|
||||||
sw.Do(&m_draw_mode.texture_x_flip);
|
sw.Do(&m_draw_mode.texture_x_flip);
|
||||||
sw.Do(&m_draw_mode.texture_y_flip);
|
sw.Do(&m_draw_mode.texture_y_flip);
|
||||||
|
|
||||||
@ -1316,10 +1317,16 @@ void GPU::SetTextureWindow(u32 value)
|
|||||||
|
|
||||||
FlushRender();
|
FlushRender();
|
||||||
|
|
||||||
m_draw_mode.texture_window_mask_x = value & UINT32_C(0x1F);
|
const u8 mask_x = Truncate8(value & UINT32_C(0x1F));
|
||||||
m_draw_mode.texture_window_mask_y = (value >> 5) & UINT32_C(0x1F);
|
const u8 mask_y = Truncate8((value >> 5) & UINT32_C(0x1F));
|
||||||
m_draw_mode.texture_window_offset_x = (value >> 10) & UINT32_C(0x1F);
|
const u8 offset_x = Truncate8((value >> 10) & UINT32_C(0x1F));
|
||||||
m_draw_mode.texture_window_offset_y = (value >> 15) & UINT32_C(0x1F);
|
const u8 offset_y = Truncate8((value >> 15) & UINT32_C(0x1F));
|
||||||
|
Log_DebugPrintf("Set texture window %02X %02X %02X %02X", mask_x, mask_y, offset_x, offset_y);
|
||||||
|
|
||||||
|
m_draw_mode.texture_window_and_x = ~(mask_x * 8);
|
||||||
|
m_draw_mode.texture_window_and_y = ~(mask_y * 8);
|
||||||
|
m_draw_mode.texture_window_or_x = (offset_x & mask_x) * 8u;
|
||||||
|
m_draw_mode.texture_window_or_y = (offset_y & mask_y) * 8u;
|
||||||
m_draw_mode.texture_window_value = value;
|
m_draw_mode.texture_window_value = value;
|
||||||
m_draw_mode.texture_window_changed = true;
|
m_draw_mode.texture_window_changed = true;
|
||||||
}
|
}
|
||||||
|
@ -306,7 +306,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Sprites/rectangles should be clipped to 12 bits before drawing.
|
// Sprites/rectangles should be clipped to 12 bits before drawing.
|
||||||
static constexpr s32 TruncateVertexPosition(s32 x) { return SignExtendN<11, s32>(x); }
|
static constexpr s32 TruncateVertexPosition(s32 x) { return SignExtendN<12, s32>(x); }
|
||||||
|
|
||||||
struct NativeVertex
|
struct NativeVertex
|
||||||
{
|
{
|
||||||
@ -581,10 +581,10 @@ protected:
|
|||||||
u32 texture_page_y;
|
u32 texture_page_y;
|
||||||
u32 texture_palette_x;
|
u32 texture_palette_x;
|
||||||
u32 texture_palette_y;
|
u32 texture_palette_y;
|
||||||
u8 texture_window_mask_x; // in 8 pixel steps
|
u8 texture_window_and_x;
|
||||||
u8 texture_window_mask_y; // in 8 pixel steps
|
u8 texture_window_and_y;
|
||||||
u8 texture_window_offset_x; // in 8 pixel steps
|
u8 texture_window_or_x;
|
||||||
u8 texture_window_offset_y; // in 8 pixel steps
|
u8 texture_window_or_y;
|
||||||
bool texture_x_flip;
|
bool texture_x_flip;
|
||||||
bool texture_y_flip;
|
bool texture_y_flip;
|
||||||
bool texture_page_changed;
|
bool texture_page_changed;
|
||||||
|
@ -228,10 +228,6 @@ bool GPU::HandleSetTextureWindowCommand()
|
|||||||
{
|
{
|
||||||
const u32 param = FifoPop() & 0x00FFFFFFu;
|
const u32 param = FifoPop() & 0x00FFFFFFu;
|
||||||
SetTextureWindow(param);
|
SetTextureWindow(param);
|
||||||
Log_DebugPrintf("Set texture window %02X %02X %02X %02X", m_draw_mode.texture_window_mask_x,
|
|
||||||
m_draw_mode.texture_window_mask_y, m_draw_mode.texture_window_offset_x,
|
|
||||||
m_draw_mode.texture_window_offset_y);
|
|
||||||
|
|
||||||
AddCommandTicks(1);
|
AddCommandTicks(1);
|
||||||
EndCommand();
|
EndCommand();
|
||||||
return true;
|
return true;
|
||||||
|
@ -948,10 +948,10 @@ void GPU_HW::DispatchRenderCommand()
|
|||||||
{
|
{
|
||||||
m_draw_mode.ClearTextureWindowChangedFlag();
|
m_draw_mode.ClearTextureWindowChangedFlag();
|
||||||
|
|
||||||
m_batch_ubo_data.u_texture_window_mask[0] = ZeroExtend32(m_draw_mode.texture_window_mask_x);
|
m_batch_ubo_data.u_texture_window_and[0] = ZeroExtend32(m_draw_mode.texture_window_and_x);
|
||||||
m_batch_ubo_data.u_texture_window_mask[1] = ZeroExtend32(m_draw_mode.texture_window_mask_y);
|
m_batch_ubo_data.u_texture_window_and[1] = ZeroExtend32(m_draw_mode.texture_window_and_y);
|
||||||
m_batch_ubo_data.u_texture_window_offset[0] = ZeroExtend32(m_draw_mode.texture_window_offset_x);
|
m_batch_ubo_data.u_texture_window_or[0] = ZeroExtend32(m_draw_mode.texture_window_or_x);
|
||||||
m_batch_ubo_data.u_texture_window_offset[1] = ZeroExtend32(m_draw_mode.texture_window_offset_y);
|
m_batch_ubo_data.u_texture_window_or[1] = ZeroExtend32(m_draw_mode.texture_window_or_y);
|
||||||
m_batch_ubo_dirty = true;
|
m_batch_ubo_dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,8 +119,8 @@ protected:
|
|||||||
|
|
||||||
struct BatchUBOData
|
struct BatchUBOData
|
||||||
{
|
{
|
||||||
u32 u_texture_window_mask[2];
|
u32 u_texture_window_and[2];
|
||||||
u32 u_texture_window_offset[2];
|
u32 u_texture_window_or[2];
|
||||||
float u_src_alpha_factor;
|
float u_src_alpha_factor;
|
||||||
float u_dst_alpha_factor;
|
float u_dst_alpha_factor;
|
||||||
u32 u_interlaced_displayed_field;
|
u32 u_interlaced_displayed_field;
|
||||||
|
@ -68,7 +68,7 @@ float4 RGBA5551ToRGBA8(uint v)
|
|||||||
void GPU_HW_ShaderGen::WriteBatchUniformBuffer(std::stringstream& ss)
|
void GPU_HW_ShaderGen::WriteBatchUniformBuffer(std::stringstream& ss)
|
||||||
{
|
{
|
||||||
DeclareUniformBuffer(ss,
|
DeclareUniformBuffer(ss,
|
||||||
{"uint2 u_texture_window_mask", "uint2 u_texture_window_offset", "float u_src_alpha_factor",
|
{"uint2 u_texture_window_and", "uint2 u_texture_window_or", "float u_src_alpha_factor",
|
||||||
"float u_dst_alpha_factor", "uint u_interlaced_displayed_field",
|
"float u_dst_alpha_factor", "uint u_interlaced_displayed_field",
|
||||||
"bool u_set_mask_while_drawing"},
|
"bool u_set_mask_while_drawing"},
|
||||||
false);
|
false);
|
||||||
@ -700,16 +700,16 @@ CONSTANT float4 TRANSPARENT_PIXEL_COLOR = float4(0.0, 0.0, 0.0, 0.0);
|
|||||||
|
|
||||||
uint2 ApplyTextureWindow(uint2 coords)
|
uint2 ApplyTextureWindow(uint2 coords)
|
||||||
{
|
{
|
||||||
uint x = (uint(coords.x) & ~(u_texture_window_mask.x * 8u)) | ((u_texture_window_offset.x & u_texture_window_mask.x) * 8u);
|
uint x = (uint(coords.x) & u_texture_window_and.x) | u_texture_window_or.x;
|
||||||
uint y = (uint(coords.y) & ~(u_texture_window_mask.y * 8u)) | ((u_texture_window_offset.y & u_texture_window_mask.y) * 8u);
|
uint y = (uint(coords.y) & u_texture_window_and.y) | u_texture_window_or.y;
|
||||||
return uint2(x, y);
|
return uint2(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint2 ApplyUpscaledTextureWindow(uint2 coords)
|
uint2 ApplyUpscaledTextureWindow(uint2 coords)
|
||||||
{
|
{
|
||||||
uint x = (uint(coords.x) & ~(u_texture_window_mask.x * 8u * RESOLUTION_SCALE)) | ((u_texture_window_offset.x & u_texture_window_mask.x) * 8u * RESOLUTION_SCALE);
|
uint2 native_coords = coords / uint2(RESOLUTION_SCALE, RESOLUTION_SCALE);
|
||||||
uint y = (uint(coords.y) & ~(u_texture_window_mask.y * 8u * RESOLUTION_SCALE)) | ((u_texture_window_offset.y & u_texture_window_mask.y) * 8u * RESOLUTION_SCALE);
|
uint2 coords_offset = coords % uint2(RESOLUTION_SCALE, RESOLUTION_SCALE);
|
||||||
return uint2(x, y);
|
return (ApplyTextureWindow(native_coords) * uint2(RESOLUTION_SCALE, RESOLUTION_SCALE)) + coords_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint2 FloatToIntegerCoords(float2 coords)
|
uint2 FloatToIntegerCoords(float2 coords)
|
||||||
|
@ -602,10 +602,8 @@ void GPU_SW::ShadePixel(u32 x, u32 y, u8 color_r, u8 color_g, u8 color_b, u8 tex
|
|||||||
{
|
{
|
||||||
// Apply texture window
|
// Apply texture window
|
||||||
// TODO: Precompute the second half
|
// TODO: Precompute the second half
|
||||||
texcoord_x = (texcoord_x & ~(m_draw_mode.texture_window_mask_x * 8u)) |
|
texcoord_x = (texcoord_x & m_draw_mode.texture_window_and_x) | m_draw_mode.texture_window_or_x;
|
||||||
((m_draw_mode.texture_window_offset_x & m_draw_mode.texture_window_mask_x) * 8u);
|
texcoord_y = (texcoord_y & m_draw_mode.texture_window_and_y) | m_draw_mode.texture_window_or_y;
|
||||||
texcoord_y = (texcoord_y & ~(m_draw_mode.texture_window_mask_y * 8u)) |
|
|
||||||
((m_draw_mode.texture_window_offset_y & m_draw_mode.texture_window_mask_y) * 8u);
|
|
||||||
|
|
||||||
VRAMPixel texture_color;
|
VRAMPixel texture_color;
|
||||||
switch (m_draw_mode.GetTextureMode())
|
switch (m_draw_mode.GetTextureMode())
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
static constexpr u32 SAVE_STATE_MAGIC = 0x43435544;
|
static constexpr u32 SAVE_STATE_MAGIC = 0x43435544;
|
||||||
static constexpr u32 SAVE_STATE_VERSION = 40;
|
static constexpr u32 SAVE_STATE_VERSION = 41;
|
||||||
|
|
||||||
#pragma pack(push, 4)
|
#pragma pack(push, 4)
|
||||||
struct SAVE_STATE_HEADER
|
struct SAVE_STATE_HEADER
|
||||||
|
Loading…
x
Reference in New Issue
Block a user