GPU/HW: Set alpha to mask bit setting

This commit is contained in:
Connor McLaughlin 2019-11-24 23:30:35 +10:00
parent bc5a247a4b
commit 024ed01bbb
3 changed files with 15 additions and 2 deletions

View file

@ -310,6 +310,15 @@ void GPU_HW::DispatchRenderCommand(RenderCommand rc, u32 num_vertices, const u32
m_batch_ubo_dirty = true; m_batch_ubo_dirty = true;
} }
if (m_batch.check_mask_before_draw != m_GPUSTAT.check_mask_before_draw ||
m_batch.set_mask_while_drawing != m_GPUSTAT.set_mask_while_drawing)
{
m_batch.check_mask_before_draw = m_GPUSTAT.check_mask_before_draw;
m_batch.set_mask_while_drawing = m_GPUSTAT.set_mask_while_drawing;
m_batch_ubo_data.u_set_mask_while_drawing = BoolToUInt32(m_GPUSTAT.set_mask_while_drawing);
m_batch_ubo_dirty = true;
}
if (m_drawing_offset_changed) if (m_drawing_offset_changed)
{ {
m_drawing_offset_changed = false; m_drawing_offset_changed = false;

View file

@ -71,6 +71,8 @@ protected:
TextureMode texture_mode; TextureMode texture_mode;
TransparencyMode transparency_mode; TransparencyMode transparency_mode;
bool dithering; bool dithering;
bool set_mask_while_drawing;
bool check_mask_before_draw;
// We need two-pass rendering when using BG-FG blending and texturing, as the transparency can be enabled // We need two-pass rendering when using BG-FG blending and texturing, as the transparency can be enabled
// on a per-pixel basis, and the opaque pixels shouldn't be blended at all. // on a per-pixel basis, and the opaque pixels shouldn't be blended at all.
@ -95,6 +97,8 @@ protected:
u32 u_texture_window_offset[2]; u32 u_texture_window_offset[2];
float u_src_alpha_factor; float u_src_alpha_factor;
float u_dst_alpha_factor; float u_dst_alpha_factor;
u32 u_set_mask_while_drawing;
u32 padding[3];
}; };
struct RendererStats struct RendererStats

View file

@ -292,7 +292,7 @@ void GPU_HW_ShaderGen::DeclareFragmentEntryPoint(std::stringstream& ss, u32 num_
void GPU_HW_ShaderGen::WriteBatchUniformBuffer(std::stringstream& ss) void GPU_HW_ShaderGen::WriteBatchUniformBuffer(std::stringstream& ss)
{ {
DeclareUniformBuffer(ss, {"int2 u_pos_offset", "uint2 u_texture_window_mask", "uint2 u_texture_window_offset", DeclareUniformBuffer(ss, {"int2 u_pos_offset", "uint2 u_texture_window_mask", "uint2 u_texture_window_offset",
"float u_src_alpha_factor", "float u_dst_alpha_factor"}); "float u_src_alpha_factor", "float u_dst_alpha_factor", "bool u_set_mask_while_drawing"});
} }
std::string GPU_HW_ShaderGen::GenerateBatchVertexShader(bool textured) std::string GPU_HW_ShaderGen::GenerateBatchVertexShader(bool textured)
@ -505,7 +505,7 @@ int4 SampleFromVRAM(int4 texpage, float2 coord)
#endif #endif
// Compute output alpha (mask bit) // Compute output alpha (mask bit)
float output_alpha = float(semitransparent); float output_alpha = float(u_set_mask_while_drawing ? 1 : int(semitransparent));
// Normalize // Normalize
float3 color = float3(icolor) / float3(255.0, 255.0, 255.0); float3 color = float3(icolor) / float3(255.0, 255.0, 255.0);