Merge pull request #540 from DrChat/gl4_fixes

GL4 fixes
This commit is contained in:
Ben Vanik
2016-02-17 16:08:09 -08:00
3 changed files with 61 additions and 12 deletions

View File

@@ -1037,6 +1037,7 @@ GL4CommandProcessor::UpdateStatus GL4CommandProcessor::UpdateRasterizerState(
XE_GPU_REG_PA_SC_SCREEN_SCISSOR_BR); XE_GPU_REG_PA_SC_SCREEN_SCISSOR_BR);
dirty |= SetShadowRegister(&regs.multi_prim_ib_reset_index, dirty |= SetShadowRegister(&regs.multi_prim_ib_reset_index,
XE_GPU_REG_VGT_MULTI_PRIM_IB_RESET_INDX); XE_GPU_REG_VGT_MULTI_PRIM_IB_RESET_INDX);
dirty |= SetShadowRegister(&regs.pa_sc_viz_query, XE_GPU_REG_PA_SC_VIZ_QUERY);
dirty |= regs.prim_type != prim_type; dirty |= regs.prim_type != prim_type;
if (!dirty) { if (!dirty) {
return UpdateStatus::kCompatible; return UpdateStatus::kCompatible;
@@ -1048,6 +1049,12 @@ GL4CommandProcessor::UpdateStatus GL4CommandProcessor::UpdateRasterizerState(
draw_batcher_.Flush(DrawBatcher::FlushMode::kStateChange); draw_batcher_.Flush(DrawBatcher::FlushMode::kStateChange);
// viz query enabled
// assert_zero(regs.pa_sc_viz_query & 0x01);
// Kill pix post early-z test
// assert_zero(regs.pa_sc_viz_query & 0x80);
// Scissoring. // Scissoring.
// TODO(benvanik): is this used? we are using scissoring for window scissor. // TODO(benvanik): is this used? we are using scissoring for window scissor.
if (regs.pa_sc_screen_scissor_tl != 0 && if (regs.pa_sc_screen_scissor_tl != 0 &&
@@ -1129,7 +1136,7 @@ GL4CommandProcessor::UpdateStatus GL4CommandProcessor::UpdateBlendState() {
// Deprecated in GL, implemented in shader. // Deprecated in GL, implemented in shader.
// if(ALPHATESTENABLE && frag_out.a [<=/ALPHAFUNC] ALPHAREF) discard; // if(ALPHATESTENABLE && frag_out.a [<=/ALPHAFUNC] ALPHAREF) discard;
uint32_t color_control = reg_file[XE_GPU_REG_RB_COLORCONTROL].u32; uint32_t color_control = reg_file[XE_GPU_REG_RB_COLORCONTROL].u32;
draw_batcher_.set_alpha_test((color_control & 0x4) != 0, // ALPAHTESTENABLE draw_batcher_.set_alpha_test((color_control & 0x8) != 0, // ALPAHTESTENABLE
color_control & 0x7, // ALPHAFUNC color_control & 0x7, // ALPHAFUNC
reg_file[XE_GPU_REG_RB_ALPHA_REF].f32); reg_file[XE_GPU_REG_RB_ALPHA_REF].f32);
@@ -1196,10 +1203,11 @@ GL4CommandProcessor::UpdateStatus GL4CommandProcessor::UpdateBlendState() {
auto blend_op_alpha = blend_op_map[(blend_control & 0x00E00000) >> 21]; auto blend_op_alpha = blend_op_map[(blend_control & 0x00E00000) >> 21];
// A2XX_RB_COLORCONTROL_BLEND_DISABLE ?? Can't find this! // A2XX_RB_COLORCONTROL_BLEND_DISABLE ?? Can't find this!
// Just guess based on actions. // Just guess based on actions.
bool blend_enable = // bool blend_enable =
!((src_blend == GL_ONE) && (dest_blend == GL_ZERO) && // !((src_blend == GL_ONE) && (dest_blend == GL_ZERO) &&
(blend_op == GL_FUNC_ADD) && (src_blend_alpha == GL_ONE) && // (blend_op == GL_FUNC_ADD) && (src_blend_alpha == GL_ONE) &&
(dest_blend_alpha == GL_ZERO) && (blend_op_alpha == GL_FUNC_ADD)); // (dest_blend_alpha == GL_ZERO) && (blend_op_alpha == GL_FUNC_ADD));
bool blend_enable = !(color_control & 0x20);
if (blend_enable) { if (blend_enable) {
glEnablei(GL_BLEND, i); glEnablei(GL_BLEND, i);
glBlendEquationSeparatei(i, blend_op, blend_op_alpha); glBlendEquationSeparatei(i, blend_op, blend_op_alpha);
@@ -1579,7 +1587,7 @@ bool GL4CommandProcessor::IssueCopy() {
TextureFormat src_format = TextureFormat::kUnknown; TextureFormat src_format = TextureFormat::kUnknown;
GLuint color_targets[4] = {kAnyTarget, kAnyTarget, kAnyTarget, kAnyTarget}; GLuint color_targets[4] = {kAnyTarget, kAnyTarget, kAnyTarget, kAnyTarget};
GLuint depth_target = kAnyTarget; GLuint depth_target = kAnyTarget;
if (copy_src_select <= 3) { if (copy_src_select <= 3 || color_clear_enabled) {
// Source from a color target. // Source from a color target.
uint32_t color_info[4] = { uint32_t color_info[4] = {
regs[XE_GPU_REG_RB_COLOR_INFO].u32, regs[XE_GPU_REG_RB_COLOR1_INFO].u32, regs[XE_GPU_REG_RB_COLOR_INFO].u32, regs[XE_GPU_REG_RB_COLOR1_INFO].u32,
@@ -1591,7 +1599,10 @@ bool GL4CommandProcessor::IssueCopy() {
(color_info[copy_src_select] >> 16) & 0xF); (color_info[copy_src_select] >> 16) & 0xF);
color_targets[copy_src_select] = GetColorRenderTarget( color_targets[copy_src_select] = GetColorRenderTarget(
surface_pitch, surface_msaa, color_base, color_format); surface_pitch, surface_msaa, color_base, color_format);
src_format = ColorRenderTargetToTextureFormat(color_format);
if (copy_src_select <= 3) {
src_format = ColorRenderTargetToTextureFormat(color_format);
}
} }
// Grab the depth/stencil if we're sourcing from it or clear is enabled. // Grab the depth/stencil if we're sourcing from it or clear is enabled.
@@ -1616,77 +1627,97 @@ bool GL4CommandProcessor::IssueCopy() {
return false; return false;
} }
active_framebuffer_ = source_framebuffer;
GLenum read_format; GLenum read_format;
GLenum read_type; GLenum read_type;
size_t read_size = 0;
switch (copy_dest_format) { switch (copy_dest_format) {
case ColorFormat::k_1_5_5_5: case ColorFormat::k_1_5_5_5:
read_format = GL_RGB5_A1; read_format = GL_RGB5_A1;
read_type = GL_UNSIGNED_SHORT_1_5_5_5_REV; read_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
read_size = 16;
break; break;
case ColorFormat::k_2_10_10_10: case ColorFormat::k_2_10_10_10:
read_format = GL_RGB10_A2; read_format = GL_RGB10_A2;
read_type = GL_UNSIGNED_INT_10_10_10_2; read_type = GL_UNSIGNED_INT_10_10_10_2;
read_size = 32;
break; break;
case ColorFormat::k_4_4_4_4: case ColorFormat::k_4_4_4_4:
read_format = GL_RGBA4; read_format = GL_RGBA4;
read_type = GL_UNSIGNED_SHORT_4_4_4_4; read_type = GL_UNSIGNED_SHORT_4_4_4_4;
read_size = 16;
break; break;
case ColorFormat::k_5_6_5: case ColorFormat::k_5_6_5:
read_format = GL_RGB565; read_format = GL_RGB565;
read_type = GL_UNSIGNED_SHORT_5_6_5; read_type = GL_UNSIGNED_SHORT_5_6_5;
read_size = 16;
break; break;
case ColorFormat::k_8: case ColorFormat::k_8:
read_format = GL_R8; read_format = GL_R8;
read_type = GL_UNSIGNED_BYTE; read_type = GL_UNSIGNED_BYTE;
read_size = 8;
break; break;
case ColorFormat::k_8_8: case ColorFormat::k_8_8:
read_format = GL_RG8; read_format = GL_RG8;
read_type = GL_UNSIGNED_BYTE; read_type = GL_UNSIGNED_BYTE;
read_size = 16;
break; break;
case ColorFormat::k_8_8_8_8: case ColorFormat::k_8_8_8_8:
read_format = copy_dest_swap ? GL_BGRA : GL_RGBA; read_format = copy_dest_swap ? GL_BGRA : GL_RGBA;
read_type = GL_UNSIGNED_BYTE; read_type = GL_UNSIGNED_BYTE;
read_size = 32;
break; break;
case ColorFormat::k_16: case ColorFormat::k_16:
read_format = GL_R16; read_format = GL_R16;
read_type = GL_UNSIGNED_SHORT; read_type = GL_UNSIGNED_SHORT;
read_size = 16;
break; break;
case ColorFormat::k_16_FLOAT: case ColorFormat::k_16_FLOAT:
read_format = GL_R16F; read_format = GL_R16F;
read_type = GL_HALF_FLOAT; read_type = GL_HALF_FLOAT;
read_size = 16;
break; break;
case ColorFormat::k_16_16: case ColorFormat::k_16_16:
read_format = GL_RG16; read_format = GL_RG16;
read_type = GL_UNSIGNED_SHORT; read_type = GL_UNSIGNED_SHORT;
read_size = 32;
break; break;
case ColorFormat::k_16_16_FLOAT: case ColorFormat::k_16_16_FLOAT:
read_format = GL_RG16F; read_format = GL_RG16F;
read_type = GL_HALF_FLOAT; read_type = GL_HALF_FLOAT;
read_size = 32;
break; break;
case ColorFormat::k_16_16_16_16: case ColorFormat::k_16_16_16_16:
read_format = GL_RGBA16; read_format = GL_RGBA16;
read_type = GL_UNSIGNED_SHORT; read_type = GL_UNSIGNED_SHORT;
read_size = 32;
break; break;
case ColorFormat::k_16_16_16_16_FLOAT: case ColorFormat::k_16_16_16_16_FLOAT:
read_format = GL_RGBA16F; read_format = GL_RGBA16F;
read_type = GL_HALF_FLOAT; read_type = GL_HALF_FLOAT;
read_size = 32;
break; break;
case ColorFormat::k_32_FLOAT: case ColorFormat::k_32_FLOAT:
read_format = GL_R32F; read_format = GL_R32F;
read_type = GL_FLOAT; read_type = GL_FLOAT;
read_size = 32;
break; break;
case ColorFormat::k_32_32_FLOAT: case ColorFormat::k_32_32_FLOAT:
read_format = GL_RG32F; read_format = GL_RG32F;
read_type = GL_FLOAT; read_type = GL_FLOAT;
read_size = 64;
break; break;
case ColorFormat::k_32_32_32_32_FLOAT: case ColorFormat::k_32_32_32_32_FLOAT:
read_format = GL_RGBA32F; read_format = GL_RGBA32F;
read_type = GL_FLOAT; read_type = GL_FLOAT;
read_size = 128;
break; break;
case ColorFormat::k_10_11_11: case ColorFormat::k_10_11_11:
case ColorFormat::k_11_11_10: case ColorFormat::k_11_11_10:
read_format = GL_R11F_G11F_B10F; read_format = GL_R11F_G11F_B10F;
read_type = GL_UNSIGNED_INT_10F_11F_11F_REV; read_type = GL_UNSIGNED_INT_10F_11F_11F_REV;
read_size = 32;
break; break;
default: default:
assert_unhandled_case(copy_dest_format); assert_unhandled_case(copy_dest_format);
@@ -1792,7 +1823,8 @@ bool GL4CommandProcessor::IssueCopy() {
// Destination pointer in guest memory. // Destination pointer in guest memory.
// We have GL throw bytes directly into it. // We have GL throw bytes directly into it.
// TODO(benvanik): copy to staging texture then PBO back? // TODO(benvanik): copy to staging texture then PBO back?
// void* ptr = memory_->TranslatePhysical(copy_dest_base); void* ptr = memory_->TranslatePhysical(copy_dest_base);
size_t size = copy_dest_pitch * copy_dest_height * (read_size / 8);
auto blitter = static_cast<xe::ui::gl::GLContext*>(context_.get())->blitter(); auto blitter = static_cast<xe::ui::gl::GLContext*>(context_.get())->blitter();
@@ -1811,7 +1843,10 @@ bool GL4CommandProcessor::IssueCopy() {
copy_dest_swap ? true : false, color_targets[copy_src_select], copy_dest_swap ? true : false, color_targets[copy_src_select],
src_rect, dest_rect); src_rect, dest_rect);
if (!FLAGS_disable_framebuffer_readback) { if (!FLAGS_disable_framebuffer_readback) {
// glReadPixels(x, y, w, h, read_format, read_type, ptr); // std::memset(ptr, 0xDE,
// copy_dest_pitch * copy_dest_height * (read_size / 8));
// glReadPixels(0, 0, copy_dest_pitch, copy_dest_height, read_format,
// read_type, ptr);
} }
} else { } else {
// Source from the bound depth/stencil target. // Source from the bound depth/stencil target.
@@ -1821,7 +1856,10 @@ bool GL4CommandProcessor::IssueCopy() {
dest_block_width, dest_block_height, src_format, dest_block_width, dest_block_height, src_format,
copy_dest_swap ? true : false, depth_target, src_rect, dest_rect); copy_dest_swap ? true : false, depth_target, src_rect, dest_rect);
if (!FLAGS_disable_framebuffer_readback) { if (!FLAGS_disable_framebuffer_readback) {
// glReadPixels(x, y, w, h, GL_DEPTH_STENCIL, read_type, ptr); // std::memset(ptr, 0xDE,
// copy_dest_pitch * copy_dest_height * (read_size / 8));
// glReadPixels(0, 0, copy_dest_pitch, copy_dest_height,
// GL_DEPTH_STENCIL, read_type, ptr);
} }
} }
break; break;
@@ -1838,7 +1876,10 @@ bool GL4CommandProcessor::IssueCopy() {
copy_dest_swap ? true : false, color_targets[copy_src_select], copy_dest_swap ? true : false, color_targets[copy_src_select],
src_rect, dest_rect); src_rect, dest_rect);
if (!FLAGS_disable_framebuffer_readback) { if (!FLAGS_disable_framebuffer_readback) {
// glReadPixels(x, y, w, h, read_format, read_type, ptr); // std::memset(ptr, 0xDE,
// copy_dest_pitch * copy_dest_height * (read_size / 8));
// glReadPixels(0, 0, copy_dest_pitch, copy_dest_height, read_format,
// read_type, ptr);
} }
} else { } else {
// Source from the bound depth/stencil target. // Source from the bound depth/stencil target.
@@ -1847,7 +1888,10 @@ bool GL4CommandProcessor::IssueCopy() {
dest_block_width, dest_block_height, src_format, dest_block_width, dest_block_height, src_format,
copy_dest_swap ? true : false, depth_target, src_rect, dest_rect); copy_dest_swap ? true : false, depth_target, src_rect, dest_rect);
if (!FLAGS_disable_framebuffer_readback) { if (!FLAGS_disable_framebuffer_readback) {
// glReadPixels(x, y, w, h, GL_DEPTH_STENCIL, read_type, ptr); // std::memset(ptr, 0xDE,
// copy_dest_pitch * copy_dest_height * (read_size / 8));
// glReadPixels(0, 0, copy_dest_pitch, copy_dest_height,
// GL_DEPTH_STENCIL, read_type, ptr);
} }
} }
break; break;

View File

@@ -192,6 +192,7 @@ class GL4CommandProcessor : public CommandProcessor {
uint32_t pa_sc_screen_scissor_tl; uint32_t pa_sc_screen_scissor_tl;
uint32_t pa_sc_screen_scissor_br; uint32_t pa_sc_screen_scissor_br;
uint32_t multi_prim_ib_reset_index; uint32_t multi_prim_ib_reset_index;
uint32_t pa_sc_viz_query;
PrimitiveType prim_type; PrimitiveType prim_type;
UpdateRasterizerStateRegisters() { Reset(); } UpdateRasterizerStateRegisters() { Reset(); }

View File

@@ -575,10 +575,14 @@ GLuint TextureCache::ConvertTexture(Blitter* blitter, uint32_t guest_address,
} }
// HACK: remove texture from write watch list so readback won't kill us. // HACK: remove texture from write watch list so readback won't kill us.
// Not needed now, as readback is disabled.
/*
if (texture_entry->write_watch_handle) { if (texture_entry->write_watch_handle) {
memory_->CancelWriteWatch(texture_entry->write_watch_handle); memory_->CancelWriteWatch(texture_entry->write_watch_handle);
texture_entry->write_watch_handle = 0; texture_entry->write_watch_handle = 0;
} }
//*/
return texture_entry->handle; return texture_entry->handle;
} }