From bff084c233f8aa836ae7e680307eeebb9f956eb6 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Sat, 1 Feb 2014 13:10:57 +0200 Subject: [PATCH 01/12] fix WriteDepthBuffer and scissoring --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index addaf0fa99..2c0c999ec3 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -433,6 +433,19 @@ void GLGSRender::WriteDepthBuffer() glReadPixels(0, 0, RSXThread::m_width, RSXThread::m_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, &Memory[address]); checkForGlError("glReadPixels"); + //TODO + //buffer rotating + static Array pixels; + pixels.SetCount(RSXThread::m_width * RSXThread::m_height); + u8* src = (u8*)Memory.VirtualToRealAddr(address); + + for(u32 y=0; y Date: Sat, 1 Feb 2014 14:54:55 +0200 Subject: [PATCH 02/12] fixed problem of textures being disabled after every end command --- rpcs3/Emu/GS/RSXThread.cpp | 5 ----- rpcs3/Emu/GS/RSXThread.h | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index bd9f4396df..6e88524c11 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -1427,11 +1427,6 @@ void RSXThread::End() //Emu.GetCallbackManager().m_exit_callback.Handle(0x0122, 0); } - for(uint i=0; i Date: Sat, 1 Feb 2014 16:15:24 +0200 Subject: [PATCH 03/12] change warning to log in lwmutex --- rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp index 77a4e93d99..76c4f87cbb 100644 --- a/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/SC_Lwmutex.cpp @@ -9,7 +9,7 @@ std::mutex g_lwmutex; int sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t attr) { - sc_lwmutex.Warning("sys_lwmutex_create(lwmutex_addr=0x%x, lwmutex_attr_addr=0x%x)", + sc_lwmutex.Log("sys_lwmutex_create(lwmutex_addr=0x%x, lwmutex_attr_addr=0x%x)", lwmutex.GetAddr(), attr.GetAddr()); if (!lwmutex.IsGood() || !attr.IsGood()) return CELL_EFAULT; @@ -43,7 +43,7 @@ int sys_lwmutex_create(mem_ptr_t lwmutex, mem_ptr_t lwmutex) { - sc_lwmutex.Warning("sys_lwmutex_destroy(lwmutex_addr=0x%x)", lwmutex.GetAddr()); + sc_lwmutex.Log("sys_lwmutex_destroy(lwmutex_addr=0x%x)", lwmutex.GetAddr()); if (!lwmutex.IsGood()) return CELL_EFAULT; @@ -68,7 +68,7 @@ int sys_lwmutex_destroy(mem_ptr_t lwmutex) int sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout) { - sc_lwmutex.Warning("sys_lwmutex_lock(lwmutex_addr=0x%x, timeout=%lld)", lwmutex.GetAddr(), timeout); + sc_lwmutex.Log("sys_lwmutex_lock(lwmutex_addr=0x%x, timeout=%lld)", lwmutex.GetAddr(), timeout); if (!lwmutex.IsGood()) return CELL_EFAULT; @@ -107,7 +107,7 @@ int sys_lwmutex_lock(mem_ptr_t lwmutex, u64 timeout) int sys_lwmutex_trylock(mem_ptr_t lwmutex) { - sc_lwmutex.Warning("sys_lwmutex_trylock(lwmutex_addr=0x%x)", lwmutex.GetAddr()); + sc_lwmutex.Log("sys_lwmutex_trylock(lwmutex_addr=0x%x)", lwmutex.GetAddr()); if (!lwmutex.IsGood()) return CELL_EFAULT; @@ -118,7 +118,7 @@ int sys_lwmutex_trylock(mem_ptr_t lwmutex) int sys_lwmutex_unlock(mem_ptr_t lwmutex) { - sc_lwmutex.Warning("sys_lwmutex_unlock(lwmutex_addr=0x%x)", lwmutex.GetAddr()); + sc_lwmutex.Log("sys_lwmutex_unlock(lwmutex_addr=0x%x)", lwmutex.GetAddr()); if (!lwmutex.IsGood()) return CELL_EFAULT; From 8467d8c8c7495f04e2c77aef41e9df404d940e16 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Sat, 1 Feb 2014 18:44:19 +0200 Subject: [PATCH 04/12] fixed clamping of texture_border --- rpcs3/Emu/GS/GL/GLGSRender.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 419f57aab3..9c74ac17b3 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -52,7 +52,7 @@ public: case 1: return GL_REPEAT; case 2: return GL_MIRRORED_REPEAT; case 3: return GL_CLAMP_TO_EDGE; - case 4: return GL_TEXTURE_BORDER; + case 4: return GL_CLAMP_TO_BORDER; case 5: return GL_CLAMP_TO_EDGE;//GL_CLAMP; //case 6: return GL_MIRROR_CLAMP_TO_EDGE_EXT; } @@ -175,6 +175,8 @@ public: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, gl_remap[remap_b]); } + checkForGlError("GLTexture::Init() -> remap"); + static const int gl_tex_zfunc[] = { GL_NEVER, @@ -191,10 +193,14 @@ public: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GetGlWrap(tex.m_wrapt)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GetGlWrap(tex.m_wrapr)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.m_zfunc]); + + checkForGlError("GLTexture::Init() -> parameters1"); glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.m_bias); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, tex.m_minlod); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, tex.m_maxlod); + + checkForGlError("GLTexture::Init() -> parameters2"); static const int gl_tex_filter[] = { @@ -210,6 +216,9 @@ public: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_filter[tex.m_min_filter]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_filter[tex.m_mag_filter]); + + checkForGlError("GLTexture::Init() -> filters"); + //Unbind(); } From ad4ad4e55d805282d216452c87bbdf0349b13734 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Mon, 3 Feb 2014 18:11:47 +0200 Subject: [PATCH 05/12] started fixing the rsx textures offset and format are done --- rpcs3/Emu/GS/GL/GLGSRender.h | 14 ++-- rpcs3/Emu/GS/RSXTexture.cpp | 136 ++++++++++++++++++++++++++++++++++ rpcs3/Emu/GS/RSXThread.cpp | 26 ++++++- rpcs3/Emu/GS/RSXThread.h | 139 +++++++---------------------------- rpcs3/Gui/RSXDebugger.cpp | 16 ++-- rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 + 7 files changed, 205 insertions(+), 130 deletions(-) create mode 100644 rpcs3/Emu/GS/RSXTexture.cpp diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 9c74ac17b3..df3745444d 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -64,9 +64,9 @@ public: void Init(RSXTexture& tex) { Bind(); - if(!Memory.IsGoodAddr(tex.GetOffset())) + if(!Memory.IsGoodAddr(GetAddress(tex.GetOffset(), tex.GetLocation()))) { - ConLog.Error("Bad texture address=0x%x", tex.GetOffset()); + ConLog.Error("Bad texture address=0x%x", GetAddress(tex.GetOffset(), tex.GetLocation())); return; } //ConLog.Warning("texture addr = 0x%x, width = %d, height = %d, max_aniso=%d, mipmap=%d, remap=0x%x, zfunc=0x%x, wraps=0x%x, wrapt=0x%x, wrapr=0x%x, minlod=0x%x, maxlod=0x%x", @@ -78,7 +78,7 @@ public: bool is_swizzled = (tex.GetFormat() & 0x20) == 0; glPixelStorei(GL_PACK_ALIGNMENT, tex.m_pitch); - char* pixels = (char*)Memory.GetMemFromAddr(tex.GetOffset()); + char* pixels = (char*)Memory.GetMemFromAddr(GetAddress(tex.GetOffset(), tex.GetLocation())); switch(format) { @@ -151,8 +151,8 @@ public: default: ConLog.Error("Init tex error: Bad tex format (0x%x | 0x%x | 0x%x)", format, tex.GetFormat() & 0x20, tex.GetFormat() & 0x40); break; } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex.m_mipmap - 1); - glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, tex.m_mipmap > 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex.Getmipmap() - 1); + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, tex.Getmipmap() > 1); if(format != 0x81 && format != 0x94) { @@ -224,13 +224,13 @@ public: void Save(RSXTexture& tex, const wxString& name) { - if(!m_id || !tex.m_offset || !tex.m_width || !tex.m_height) return; + if(!m_id || !tex.GetOffset() || !tex.m_width || !tex.m_height) return; u32* alldata = new u32[tex.m_width * tex.m_height]; Bind(); - switch(tex.m_format & ~(0x20 | 0x40)) + switch(tex.GetFormat() & ~(0x20 | 0x40)) { case 0x81: glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, alldata); diff --git a/rpcs3/Emu/GS/RSXTexture.cpp b/rpcs3/Emu/GS/RSXTexture.cpp new file mode 100644 index 0000000000..1006b37afb --- /dev/null +++ b/rpcs3/Emu/GS/RSXTexture.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h" +#include "RSXThread.h" + +RSXTexture::RSXTexture() + : m_width(0) + , m_height(0) + , m_enabled(false) + , m_minlod(0) + , m_maxlod(1000) + , m_maxaniso(0) + , m_wraps(1) + , m_wrapt(1) + , m_wrapr(3) + , m_zfunc(0) + , m_gamma(0) + , m_bias(0) + , m_remap(0xE4) + , m_min_filter(1) + , m_mag_filter(2) +{ + m_index = 0; +} + +RSXTexture::RSXTexture(u8 index) + : m_width(0) + , m_height(0) + , m_enabled(false) + , m_minlod(0) + , m_maxlod(1000) + , m_maxaniso(0) + , m_wraps(1) + , m_wrapt(1) + , m_wrapr(3) + , m_zfunc(0) + , m_gamma(0) + , m_bias(0) + , m_remap(0xE4) + , m_min_filter(1) + , m_mag_filter(2) +{ + m_index = index; +} + +u32 RSXTexture::GetOffset() const +{ + return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*4)]; +} + +u8 RSXTexture::GetLocation() const +{ + return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] & 0x3) - 1; +} + +bool RSXTexture::isCubemap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 2) & 0x1); +} + +u8 RSXTexture::GetBorderType() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 3) & 0x1); +} + +u8 RSXTexture::GetDimension() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 4) & 0xf); +} + +u8 RSXTexture::GetFormat() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 8) & 0xff); +} + +u16 RSXTexture::Getmipmap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 16) & 0xffff); +} + +void RSXTexture::SetRect(const u32 width, const u32 height) +{ + m_width = width; + m_height = height; +} + +void RSXTexture::SetAddress(u8 wraps, u8 wrapt, u8 wrapr, u8 unsigned_remap, u8 zfunc, u8 gamma, u8 aniso_bias, u8 signed_remap) +{ + m_wraps = wraps; + m_wrapt = wrapt; + m_wrapr = wrapr; + m_unsigned_remap = unsigned_remap; + m_zfunc = zfunc; + m_gamma = gamma; + m_aniso_bias = aniso_bias; + m_signed_remap = signed_remap; +} + +void RSXTexture::SetControl0(const bool enable, const u16 minlod, const u16 maxlod, const u8 maxaniso) +{ + m_enabled = enable; + m_minlod = minlod; + m_maxlod = maxlod; + m_maxaniso = maxaniso; +} + +void RSXTexture::SetControl1(u32 remap) +{ + m_remap = remap; +} + +void RSXTexture::SetControl3(u16 depth, u32 pitch) +{ + m_depth = depth; + m_pitch = pitch; +} + +void RSXTexture::SetFilter(u16 bias, u8 min, u8 mag, u8 conv, u8 a_signed, u8 r_signed, u8 g_signed, u8 b_signed) +{ + m_bias = bias; + m_min_filter = min; + m_mag_filter = mag; + m_conv = conv; + m_a_signed = a_signed; + m_r_signed = r_signed; + m_g_signed = g_signed; + m_b_signed = b_signed; +} + +wxSize RSXTexture::GetRect() const +{ + return wxSize(m_width, m_height); +} + +bool RSXTexture::IsEnabled() const +{ + return m_enabled; +} \ No newline at end of file diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index 6e88524c11..0d82d494f6 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -3,6 +3,21 @@ #define ARGS(x) (Memory.Read32(Memory.RSXIOMem.GetStartAddr() + re(m_ctrl->get) + (4*(x+1)))) +u32 methodRegisters[0xffff]; + +u32 GetAddress(u32 offset, u8 location) +{ + switch(location) + { + case CELL_GCM_LOCATION_LOCAL: return Memory.RSXFBMem.GetStartAddr() + offset; + case CELL_GCM_LOCATION_MAIN: return Memory.RSXIOMem.getRealAddr(Memory.RSXIOMem.GetStartAddr() + offset); + } + + ConLog.Error("GetAddress(offset=0x%x, location=0x%x)", location); + assert(0); + return 0; +} + RSXVertexData::RSXVertexData() : frequency(0) , stride(0) @@ -205,8 +220,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 if(!Memory.IsGoodAddr(tex_addr)) ConLog.Error("Bad texture[%d] addr = 0x%x #offset = 0x%x, location=%d", index, tex_addr, offset, location); //ConLog.Warning("texture addr = 0x%x #offset = 0x%x, location=%d", tex_addr, offset, location); - tex.SetOffset(tex_addr); - tex.SetFormat(cubemap, dimension, format, mipmap); if(!tex.m_width || !tex.m_height) { @@ -1441,6 +1454,7 @@ void RSXThread::End() void RSXThread::Task() { + u8 inc; ConLog.Write("RSX thread entry"); OnInitThread(); @@ -1449,6 +1463,8 @@ void RSXThread::Task() { wxCriticalSectionLocker lock(m_cs_main); + inc=1; + u32 put, get; se_t::func(put, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, put)))); se_t::func(get, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, get)))); @@ -1499,6 +1515,7 @@ void RSXThread::Task() if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT) { //ConLog.Warning("non increment cmd! 0x%x", cmd); + inc=0; } if(cmd == 0) @@ -1508,6 +1525,11 @@ void RSXThread::Task() continue; } + for(int i=0; iGetId()) SHOW_BUFFER(3); if (event.GetId() == p_buffer_tex->GetId()) { - if(Memory.IsGoodAddr(render.m_textures[m_cur_texture].m_offset) && render.m_textures[m_cur_texture].m_width && render.m_textures[m_cur_texture].m_height) + if(Memory.IsGoodAddr(GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation())) && render.m_textures[m_cur_texture].m_width && render.m_textures[m_cur_texture].m_height) MemoryViewerPanel::ShowImage(this, - render.m_textures[m_cur_texture].m_offset, 0, + GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()), 0, render.m_textures[m_cur_texture].m_width, render.m_textures[m_cur_texture].m_height, false); } @@ -417,7 +417,7 @@ void RSXDebugger::GetBuffers() } // Draw Texture - u32 TexBuffer_addr = render.m_textures[m_cur_texture].m_offset; + u32 TexBuffer_addr = GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()); if(!Memory.IsGoodAddr(TexBuffer_addr)) return; @@ -485,12 +485,12 @@ void RSXDebugger::GetTexture() for(uint i=0; iInsertItem(i, wxString::Format("%d", i)); - m_list_texture->SetItem(i, 1, wxString::Format("0x%x", render.m_textures[i].m_offset)); - m_list_texture->SetItem(i, 2, render.m_textures[i].m_cubemap ? "True" : "False"); - m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].m_dimension)); + m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()))); + m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); + m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); m_list_texture->SetItem(i, 4, render.m_textures[i].m_enabled ? "True" : "False"); - m_list_texture->SetItem(i, 5, wxString::Format("0x%x", render.m_textures[i].m_format)); - m_list_texture->SetItem(i, 6, wxString::Format("0x%x", render.m_textures[i].m_mipmap)); + m_list_texture->SetItem(i, 5, wxString::Format("0x%x", render.m_textures[i].GetFormat())); + m_list_texture->SetItem(i, 6, wxString::Format("0x%x", render.m_textures[i].Getmipmap())); m_list_texture->SetItem(i, 7, wxString::Format("0x%x", render.m_textures[i].m_pitch)); m_list_texture->SetItem(i, 8, wxString::Format("%dx%d", render.m_textures[i].m_width, diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index e8e50cafc2..96218bbf72 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -235,6 +235,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 45dd7d3051..4eabc97c06 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -373,6 +373,9 @@ Emu\SysCalls\lv2 + + Emu\GS + From d2bd0b0ccfc4a9a7beae3de4ca4fa2fe80ed5682 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Tue, 4 Feb 2014 18:47:31 +0200 Subject: [PATCH 06/12] Copy Paste :P (thnx AlexAletra) --- rpcs3/Gui/RSXDebugger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpcs3/Gui/RSXDebugger.cpp b/rpcs3/Gui/RSXDebugger.cpp index 412143cac4..2b6990a32a 100644 --- a/rpcs3/Gui/RSXDebugger.cpp +++ b/rpcs3/Gui/RSXDebugger.cpp @@ -485,7 +485,7 @@ void RSXDebugger::GetTexture() for(uint i=0; iInsertItem(i, wxString::Format("%d", i)); - m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[m_cur_texture].GetOffset(), render.m_textures[m_cur_texture].GetLocation()))); + m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), render.m_textures[i].GetLocation()))); m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); m_list_texture->SetItem(i, 4, render.m_textures[i].m_enabled ? "True" : "False"); From c515cb8fb6d8722faad980a82dfe278da6471687 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Wed, 5 Feb 2014 22:48:30 +0200 Subject: [PATCH 07/12] more rsx texture (address, control0, image rect) --- rpcs3/Emu/GS/GL/GLGSRender.h | 54 ++++++------- rpcs3/Emu/GS/RSXTexture.cpp | 142 +++++++++++++++++++++++------------ rpcs3/Emu/GS/RSXThread.cpp | 65 ++-------------- rpcs3/Emu/GS/RSXThread.h | 64 ++++++++-------- 4 files changed, 159 insertions(+), 166 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index df3745444d..7a174ec7d6 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -53,8 +53,10 @@ public: case 2: return GL_MIRRORED_REPEAT; case 3: return GL_CLAMP_TO_EDGE; case 4: return GL_CLAMP_TO_BORDER; - case 5: return GL_CLAMP_TO_EDGE;//GL_CLAMP; - //case 6: return GL_MIRROR_CLAMP_TO_EDGE_EXT; + case 5: return GL_CLAMP_TO_EDGE; + case 6: return GL_MIRROR_CLAMP_TO_EDGE_EXT; + case 7: return GL_MIRROR_CLAMP_TO_BORDER_EXT; + case 8: return GL_MIRROR_CLAMP_EXT; } ConLog.Error("Texture wrap error: bad wrap (%d).", wrap); @@ -83,7 +85,7 @@ public: switch(format) { case 0x81: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BLUE, GL_UNSIGNED_BYTE, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE); @@ -95,39 +97,39 @@ public: break; case 0x85: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); break; case 0x86: { - u32 size = ((tex.m_width + 3) / 4) * ((tex.m_height + 3) / 4) * 8; + u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 8; - glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, tex.m_width, tex.m_height, 0, size, pixels); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, tex.GetWidth(), tex.GetHeight(), 0, size, pixels); checkForGlError("GLTexture::Init() -> glCompressedTexImage2D"); } break; case 0x87: { - u32 size = ((tex.m_width + 3) / 4) * ((tex.m_height + 3) / 4) * 16; + u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; - glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, tex.m_width, tex.m_height, 0, size, pixels); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, tex.GetWidth(), tex.GetHeight(), 0, size, pixels); checkForGlError("GLTexture::Init() -> glCompressedTexImage2D"); } break; case 0x88: { - u32 size = ((tex.m_width + 3) / 4) * ((tex.m_height + 3) / 4) * 16; + u32 size = ((tex.GetWidth() + 3) / 4) * ((tex.GetHeight() + 3) / 4) * 16; - glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, tex.m_width, tex.m_height, 0, size, pixels); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, tex.GetWidth(), tex.GetHeight(), 0, size, pixels); checkForGlError("GLTexture::Init() -> glCompressedTexImage2D"); } break; case 0x94: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_RED, GL_SHORT, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_RED, GL_SHORT, pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_ONE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ONE); @@ -136,13 +138,13 @@ public: break; case 0x9a: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BGRA, GL_HALF_FLOAT, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_HALF_FLOAT, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); break; case 0x9e: { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.m_width, tex.m_height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); checkForGlError("GLTexture::Init() -> glTexImage2D"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ONE); } @@ -189,16 +191,16 @@ public: GL_ALWAYS, }; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GetGlWrap(tex.m_wraps)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GetGlWrap(tex.m_wrapt)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GetGlWrap(tex.m_wrapr)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.m_zfunc]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GetGlWrap(tex.GetWrapS())); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GetGlWrap(tex.GetWrapT())); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GetGlWrap(tex.GetWrapR())); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.GetZfunc()]); checkForGlError("GLTexture::Init() -> parameters1"); glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.m_bias); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, tex.m_minlod); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, tex.m_maxlod); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (tex.GetMinLOD() >> 8)); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (tex.GetMaxLOD() >> 8)); checkForGlError("GLTexture::Init() -> parameters2"); @@ -224,9 +226,9 @@ public: void Save(RSXTexture& tex, const wxString& name) { - if(!m_id || !tex.GetOffset() || !tex.m_width || !tex.m_height) return; + if(!m_id || !tex.GetOffset() || !tex.GetWidth() || !tex.GetHeight()) return; - u32* alldata = new u32[tex.m_width * tex.m_height]; + u32* alldata = new u32[tex.GetWidth() * tex.GetHeight()]; Bind(); @@ -247,15 +249,15 @@ public: { wxFile f(name + ".raw", wxFile::write); - f.Write(alldata, tex.m_width * tex.m_height * 4); + f.Write(alldata, tex.GetWidth() * tex.GetHeight() * 4); } - u8* data = new u8[tex.m_width * tex.m_height * 3]; - u8* alpha = new u8[tex.m_width * tex.m_height]; + u8* data = new u8[tex.GetWidth() * tex.GetHeight() * 3]; + u8* alpha = new u8[tex.GetWidth() * tex.GetHeight()]; u8* src = (u8*)alldata; u8* dst_d = data; u8* dst_a = alpha; - for(u32 i=0; i> 16) & 0xffff); } -void RSXTexture::SetRect(const u32 width, const u32 height) +u8 RSXTexture::GetWrapS() const { - m_width = width; - m_height = height; + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)]) & 0xf); } -void RSXTexture::SetAddress(u8 wraps, u8 wrapt, u8 wrapr, u8 unsigned_remap, u8 zfunc, u8 gamma, u8 aniso_bias, u8 signed_remap) +u8 RSXTexture::GetWrapT() const { - m_wraps = wraps; - m_wrapt = wrapt; - m_wrapr = wrapr; - m_unsigned_remap = unsigned_remap; - m_zfunc = zfunc; - m_gamma = gamma; - m_aniso_bias = aniso_bias; - m_signed_remap = signed_remap; + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 8) & 0xf); +} + +u8 RSXTexture::GetWrapR() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 16) & 0xf); +} + +u8 RSXTexture::GetUnsignedRemap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 12) & 0xf); +} + +u8 RSXTexture::GetZfunc() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 28) & 0xf); +} + +u8 RSXTexture::GetGamma() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 20) & 0xf); +} + +u8 RSXTexture::GetAnisoBias() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 4) & 0xf); +} + +u8 RSXTexture::GetSignedRemap() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 24) & 0xf); +} + +bool RSXTexture::IsEnabled() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 31) & 0x1); +} + +u16 RSXTexture::GetMinLOD() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 19) & 0xfff); +} + +u16 RSXTexture::GetMaxLOD() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 7) & 0xfff); +} + +u8 RSXTexture::GetMaxAniso() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 4) & 0x7); +} + +bool RSXTexture::IsAlphaKillEnabled() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 2) & 0x1); +} + +u16 RSXTexture::GetWidth() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)] >> 16) & 0xffff); +} + +u16 RSXTexture::GetHeight() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)]) & 0xffff); } void RSXTexture::SetControl0(const bool enable, const u16 minlod, const u16 maxlod, const u8 maxaniso) { - m_enabled = enable; - m_minlod = minlod; - m_maxlod = maxlod; - m_maxaniso = maxaniso; } void RSXTexture::SetControl1(u32 remap) @@ -123,14 +175,4 @@ void RSXTexture::SetFilter(u16 bias, u8 min, u8 mag, u8 conv, u8 a_signed, u8 r_ m_r_signed = r_signed; m_g_signed = g_signed; m_b_signed = b_signed; -} - -wxSize RSXTexture::GetRect() const -{ - return wxSize(m_width, m_height); -} - -bool RSXTexture::IsEnabled() const -{ - return m_enabled; } \ No newline at end of file diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index 0d82d494f6..346a1d5728 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -200,33 +200,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_OFFSET, 0x20): { - RSXTexture& tex = m_textures[index]; - const u32 offset = ARGS(0); - u32 a1 = ARGS(1); - u8 location = (a1 & 0x3) - 1; - const bool cubemap = (a1 >> 2) & 0x1; - const u8 dimension = (a1 >> 4) & 0xf; - const u8 format = (a1 >> 8) & 0xff; - const u16 mipmap = (a1 >> 16) & 0xffff; - CMD_LOG("index = %d, offset=0x%x, location=0x%x, cubemap=0x%x, dimension=0x%x, format=0x%x, mipmap=0x%x", - index, offset, location, cubemap, dimension, format, mipmap); - - if(location == 2) - { - ConLog.Error("Bad texture location."); - location = 1; - } - u32 tex_addr = GetAddress(offset, location); - if(!Memory.IsGoodAddr(tex_addr)) - ConLog.Error("Bad texture[%d] addr = 0x%x #offset = 0x%x, location=%d", index, tex_addr, offset, location); - //ConLog.Warning("texture addr = 0x%x #offset = 0x%x, location=%d", tex_addr, offset, location); - - if(!tex.m_width || !tex.m_height) - { - gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); - if(!tex.m_width) tex.m_width = re(buffers[m_gcm_current_buffer].width); - if(!tex.m_height) tex.m_height = re(buffers[m_gcm_current_buffer].height); - } } break; @@ -341,19 +314,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_ADDRESS, 0x20): { - RSXTexture& tex = m_textures[index]; - - u32 a0 = ARGS(0); - u8 wraps = a0 & 0xf; - u8 aniso_bias = (a0 >> 4) & 0xf; - u8 wrapt = (a0 >> 8) & 0xf; - u8 unsigned_remap = (a0 >> 12) & 0xf; - u8 wrapr = (a0 >> 16) & 0xf; - u8 gamma = (a0 >> 20) & 0xf; - u8 signed_remap = (a0 >> 24) & 0xf; - u8 zfunc = a0 >> 28; - - tex.SetAddress(wraps, wrapt, wrapr, unsigned_remap, zfunc, gamma, aniso_bias, signed_remap); } break; @@ -363,26 +323,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_IMAGE_RECT, 32): { - RSXTexture& tex = m_textures[index]; - - u16 height = ARGS(0) & 0xffff; - u16 width = ARGS(0) >> 16; - CMD_LOG("width=%d, height=%d", width, height); - - if(!width || !height) - { - ConLog.Warning("Bad texture rect: %dx%d (%dx%d)", width, height, tex.m_width, tex.m_height); - for(int i=0; i Date: Mon, 10 Feb 2014 17:57:32 +0200 Subject: [PATCH 08/12] implemented viewport scale and offset (but everything seems to flip now :( ) --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 43 +++++++++++++++++------------ rpcs3/Emu/GS/GL/GLVertexProgram.cpp | 3 +- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 2c0c999ec3..4ea5f4db7a 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -304,17 +304,39 @@ void GLGSRender::DisableVertexData() void GLGSRender::InitVertexData() { + GLfloat scaleOffsetMat[16] = {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + int l; + for(u32 i=0; i pixels; - pixels.SetCount(RSXThread::m_width * RSXThread::m_height); - u8* src = (u8*)Memory.VirtualToRealAddr(address); - - for(u32 y=0; y Date: Mon, 10 Feb 2014 18:34:30 +0200 Subject: [PATCH 09/12] more rsx texture (control1) and fixed crash of rsx debugger --- rpcs3/Emu/GS/GL/GLGSRender.h | 8 ++++---- rpcs3/Emu/GS/RSXTexture.cpp | 16 +++++----------- rpcs3/Emu/GS/RSXThread.cpp | 9 --------- rpcs3/Emu/GS/RSXThread.h | 7 +++---- rpcs3/Gui/RSXDebugger.cpp | 27 +++++++++++++++------------ 5 files changed, 27 insertions(+), 40 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index 7a174ec7d6..ef46141163 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -158,10 +158,10 @@ public: if(format != 0x81 && format != 0x94) { - u8 remap_a = tex.m_remap & 0x3; - u8 remap_r = (tex.m_remap >> 2) & 0x3; - u8 remap_g = (tex.m_remap >> 4) & 0x3; - u8 remap_b = (tex.m_remap >> 6) & 0x3; + u8 remap_a = tex.GetRemap() & 0x3; + u8 remap_r = (tex.GetRemap() >> 2) & 0x3; + u8 remap_g = (tex.GetRemap() >> 4) & 0x3; + u8 remap_b = (tex.GetRemap() >> 6) & 0x3; static const int gl_remap[] = { diff --git a/rpcs3/Emu/GS/RSXTexture.cpp b/rpcs3/Emu/GS/RSXTexture.cpp index e064fa2f3b..16b470e319 100644 --- a/rpcs3/Emu/GS/RSXTexture.cpp +++ b/rpcs3/Emu/GS/RSXTexture.cpp @@ -3,7 +3,6 @@ RSXTexture::RSXTexture() : m_bias(0) - , m_remap(0xE4) , m_min_filter(1) , m_mag_filter(2) { @@ -12,7 +11,6 @@ RSXTexture::RSXTexture() RSXTexture::RSXTexture(u8 index) : m_bias(0) - , m_remap(0xE4) , m_min_filter(1) , m_mag_filter(2) { @@ -140,6 +138,11 @@ bool RSXTexture::IsAlphaKillEnabled() const return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 2) & 0x1); } +u32 RSXTexture::GetRemap() const +{ + return (methodRegisters[NV4097_SET_TEXTURE_CONTROL1 + (m_index*4)]); +} + u16 RSXTexture::GetWidth() const { return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)] >> 16) & 0xffff); @@ -150,15 +153,6 @@ u16 RSXTexture::GetHeight() const return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)]) & 0xffff); } -void RSXTexture::SetControl0(const bool enable, const u16 minlod, const u16 maxlod, const u8 maxaniso) -{ -} - -void RSXTexture::SetControl1(u32 remap) -{ - m_remap = remap; -} - void RSXTexture::SetControl3(u16 depth, u32 pitch) { m_depth = depth; diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index 346a1d5728..4dea573808 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -205,13 +205,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_CONTROL0, 0x20): { - RSXTexture& tex = m_textures[index]; - u32 a0 = ARGS(0); - bool enable = a0 >> 31 ? true : false; - u16 minlod = (a0 >> 19) & 0xfff; - u16 maxlod = (a0 >> 7) & 0xfff; - u8 maxaniso = (a0 >> 2) & 0x7; - tex.SetControl0(enable, minlod, maxlod, maxaniso); } break; @@ -280,8 +273,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_CONTROL1, 0x20): { - RSXTexture& tex = m_textures[index]; - tex.SetControl1(ARGS(0)); } break; diff --git a/rpcs3/Emu/GS/RSXThread.h b/rpcs3/Emu/GS/RSXThread.h index fe05924aa6..b8e93153a9 100644 --- a/rpcs3/Emu/GS/RSXThread.h +++ b/rpcs3/Emu/GS/RSXThread.h @@ -31,8 +31,6 @@ public: u8 m_g_signed; u8 m_b_signed; - u32 m_remap; - public: RSXTexture(); RSXTexture(u8 index); @@ -66,12 +64,13 @@ public: u8 GetMaxAniso() const; bool IsAlphaKillEnabled() const; + // Control1 + u32 GetRemap() const; + // Image Rect u16 GetWidth() const; u16 GetHeight() const; - void SetControl0(const bool enable, const u16 minlod, const u16 maxlod, const u8 maxaniso); - void SetControl1(u32 remap); void SetControl3(u16 depth, u32 pitch); void SetFilter(u16 bias, u8 min, u8 mag, u8 conv, u8 a_signed, u8 r_signed, u8 g_signed, u8 b_signed); }; diff --git a/rpcs3/Gui/RSXDebugger.cpp b/rpcs3/Gui/RSXDebugger.cpp index c442a10c99..80c5027ad6 100644 --- a/rpcs3/Gui/RSXDebugger.cpp +++ b/rpcs3/Gui/RSXDebugger.cpp @@ -484,19 +484,22 @@ void RSXDebugger::GetTexture() for(uint i=0; iInsertItem(i, wxString::Format("%d", i)); - m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), render.m_textures[i].GetLocation()))); - m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); - m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); - m_list_texture->SetItem(i, 4, render.m_textures[i].IsEnabled() ? "True" : "False"); - m_list_texture->SetItem(i, 5, wxString::Format("0x%x", render.m_textures[i].GetFormat())); - m_list_texture->SetItem(i, 6, wxString::Format("0x%x", render.m_textures[i].Getmipmap())); - m_list_texture->SetItem(i, 7, wxString::Format("0x%x", render.m_textures[i].m_pitch)); - m_list_texture->SetItem(i, 8, wxString::Format("%dx%d", - render.m_textures[i].GetWidth(), - render.m_textures[i].GetHeight())); + if(render.m_textures[i].IsEnabled()) + { + m_list_texture->InsertItem(i, wxString::Format("%d", i)); + m_list_texture->SetItem(i, 1, wxString::Format("0x%x", GetAddress(render.m_textures[i].GetOffset(), render.m_textures[i].GetLocation()))); + m_list_texture->SetItem(i, 2, render.m_textures[i].isCubemap() ? "True" : "False"); + m_list_texture->SetItem(i, 3, wxString::Format("%dD", render.m_textures[i].GetDimension())); + m_list_texture->SetItem(i, 4, render.m_textures[i].IsEnabled() ? "True" : "False"); + m_list_texture->SetItem(i, 5, wxString::Format("0x%x", render.m_textures[i].GetFormat())); + m_list_texture->SetItem(i, 6, wxString::Format("0x%x", render.m_textures[i].Getmipmap())); + m_list_texture->SetItem(i, 7, wxString::Format("0x%x", render.m_textures[i].m_pitch)); + m_list_texture->SetItem(i, 8, wxString::Format("%dx%d", + render.m_textures[i].GetWidth(), + render.m_textures[i].GetHeight())); - m_list_texture->SetItemBackgroundColour(i, wxColour(m_cur_texture == i ? "Wheat" : "White")); + m_list_texture->SetItemBackgroundColour(i, wxColour(m_cur_texture == i ? "Wheat" : "White")); + } } } From 6846d15dc840f000df6d820030aeb31750cf9e80 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Thu, 13 Feb 2014 19:02:46 +0200 Subject: [PATCH 10/12] more rsx texture (filters) implemented deswizzling of textures (only one format for now, a fix for multiple context sample) --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 29 ++++++++ rpcs3/Emu/GS/GL/GLGSRender.h | 48 ++++++++++--- rpcs3/Emu/GS/RSXTexture.cpp | 122 ++++++++++++++++++++------------- rpcs3/Emu/GS/RSXThread.cpp | 12 ---- rpcs3/Emu/GS/RSXThread.h | 20 +++--- 5 files changed, 154 insertions(+), 77 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 4ea5f4db7a..9d02e706f6 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -1107,3 +1107,32 @@ void GLGSRender::Flip() checkForGlError("glScissor"); } } + +uint32_t LinearToSwizzleAddress( + uint32_t x, uint32_t y, uint32_t z, + uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth) +{ + uint32_t offset = 0; + uint32_t shift_count = 0; + while(log2_width | log2_height | log2_depth){ + if(log2_width){ + offset |= (x & 0x01) << shift_count; + x >>= 1; + ++shift_count; + --log2_width; + } + if(log2_height){ + offset |= (y & 0x01) << shift_count; + y >>= 1; + ++shift_count; + --log2_height; + } + if(log2_depth){ + offset |= (z & 0x01) << shift_count; + z >>= 1; + ++shift_count; + --log2_depth; + } + } + return offset; +} \ No newline at end of file diff --git a/rpcs3/Emu/GS/GL/GLGSRender.h b/rpcs3/Emu/GS/GL/GLGSRender.h index ef46141163..97e9d36882 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.h +++ b/rpcs3/Emu/GS/GL/GLGSRender.h @@ -14,6 +14,9 @@ extern GLenum g_last_gl_error; void printGlError(GLenum err, const char* situation); +uint32_t LinearToSwizzleAddress( + uint32_t x, uint32_t y, uint32_t z, + uint32_t log2_width, uint32_t log2_height, uint32_t log2_depth); #if RSX_DEBUG #define checkForGlError(sit) if((g_last_gl_error = glGetError()) != GL_NO_ERROR) printGlError(g_last_gl_error, sit) @@ -81,6 +84,7 @@ public: glPixelStorei(GL_PACK_ALIGNMENT, tex.m_pitch); char* pixels = (char*)Memory.GetMemFromAddr(GetAddress(tex.GetOffset(), tex.GetLocation())); + char* unswizzledPixels; switch(format) { @@ -97,7 +101,28 @@ public: break; case 0x85: - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.GetWidth(), tex.GetHeight(), 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels); + if(is_swizzled) + { + uint32_t *src, *dst; + uint32_t log2width, log2height; + + unswizzledPixels = (char*)malloc(tex.GetWidth() * tex.GetHeight() * 4); + src = (uint32_t*)pixels; + dst = (uint32_t*)unswizzledPixels; + + log2width = log(tex.GetWidth())/log(2); + log2height = log(tex.GetHeight())/log(2); + + for(int i=0; i glTexImage2D"); break; @@ -150,7 +175,7 @@ public: } break; - default: ConLog.Error("Init tex error: Bad tex format (0x%x | 0x%x | 0x%x)", format, tex.GetFormat() & 0x20, tex.GetFormat() & 0x40); break; + default: ConLog.Error("Init tex error: Bad tex format (0x%x | %s | 0x%x)", format, is_swizzled ? "swizzled" : "linear", tex.GetFormat() & 0x40); break; } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex.Getmipmap() - 1); @@ -177,7 +202,7 @@ public: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, gl_remap[remap_b]); } - checkForGlError("GLTexture::Init() -> remap"); + checkForGlError("GLTexture::Init() -> remap"); static const int gl_tex_zfunc[] = { @@ -196,13 +221,13 @@ public: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GetGlWrap(tex.GetWrapR())); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.GetZfunc()]); - checkForGlError("GLTexture::Init() -> parameters1"); + checkForGlError("GLTexture::Init() -> parameters1"); - glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.m_bias); + glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.GetBias()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (tex.GetMinLOD() >> 8)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (tex.GetMaxLOD() >> 8)); - checkForGlError("GLTexture::Init() -> parameters2"); + checkForGlError("GLTexture::Init() -> parameters2"); static const int gl_tex_filter[] = { @@ -216,12 +241,17 @@ public: GL_NEAREST, }; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_filter[tex.m_min_filter]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_filter[tex.m_mag_filter]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_tex_filter[tex.GetMinFilter()]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_tex_filter[tex.GetMagFilter()]); - checkForGlError("GLTexture::Init() -> filters"); + checkForGlError("GLTexture::Init() -> filters"); //Unbind(); + + if(is_swizzled && format == 0x85) + { + free(unswizzledPixels); + } } void Save(RSXTexture& tex, const wxString& name) diff --git a/rpcs3/Emu/GS/RSXTexture.cpp b/rpcs3/Emu/GS/RSXTexture.cpp index 16b470e319..8db5499a02 100644 --- a/rpcs3/Emu/GS/RSXTexture.cpp +++ b/rpcs3/Emu/GS/RSXTexture.cpp @@ -2,17 +2,11 @@ #include "RSXThread.h" RSXTexture::RSXTexture() - : m_bias(0) - , m_min_filter(1) - , m_mag_filter(2) { m_index = 0; } RSXTexture::RSXTexture(u8 index) - : m_bias(0) - , m_min_filter(1) - , m_mag_filter(2) { m_index = index; } @@ -20,153 +14,189 @@ RSXTexture::RSXTexture(u8 index) void RSXTexture::Init() { // Offset - methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*4)] = 0; + methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*32)] = 0; // Format - methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] = 0; + methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] = 0; // Address - methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] = + methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] = ((/*wraps*/1) | ((/*anisoBias*/0) << 4) | ((/*wrapt*/1) << 8) | ((/*unsignedRemap*/0) << 12) | ((/*wrapr*/2) << 16) | ((/*gamma*/0) << 20) |((/*signedRemap*/0) << 24) | ((/*zfunc*/0) << 28)); // Control0 - methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] = + methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] = (((/*alphakill*/0) << 2) | (/*maxaniso*/0) << 4) | ((/*maxlod*/0xc00) << 7) | ((/*minlod*/0) << 19) | ((/*enable*/0) << 31); + // Control1 + methodRegisters[NV4097_SET_TEXTURE_CONTROL1 + (m_index*32)] = 0xE4; + + // Filter + methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] = + ((/*bias*/0) | ((/*conv*/1) << 13) | ((/*min*/5) << 16) | ((/*mag*/2) << 24) + | ((/*as*/0) << 28) | ((/*rs*/0) << 29) | ((/*gs*/0) << 30) | ((/*bs*/0) << 31) ); + // Image Rect - methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)] = (/*height*/1) | ((/*width*/1) << 16); + methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)] = (/*height*/1) | ((/*width*/1) << 16); } u32 RSXTexture::GetOffset() const { - return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*4)]; + return methodRegisters[NV4097_SET_TEXTURE_OFFSET + (m_index*32)]; } u8 RSXTexture::GetLocation() const { - return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] & 0x3) - 1; + return (methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] & 0x3) - 1; } bool RSXTexture::isCubemap() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 2) & 0x1); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 2) & 0x1); } u8 RSXTexture::GetBorderType() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 3) & 0x1); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 3) & 0x1); } u8 RSXTexture::GetDimension() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 4) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 4) & 0xf); } u8 RSXTexture::GetFormat() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 8) & 0xff); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 8) & 0xff); } u16 RSXTexture::Getmipmap() const { - return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*4)] >> 16) & 0xffff); + return ((methodRegisters[NV4097_SET_TEXTURE_FORMAT + (m_index*32)] >> 16) & 0xffff); } u8 RSXTexture::GetWrapS() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)]) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)]) & 0xf); } u8 RSXTexture::GetWrapT() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 8) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 8) & 0xf); } u8 RSXTexture::GetWrapR() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 16) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 16) & 0xf); } u8 RSXTexture::GetUnsignedRemap() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 12) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 12) & 0xf); } u8 RSXTexture::GetZfunc() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 28) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 28) & 0xf); } u8 RSXTexture::GetGamma() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 20) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 20) & 0xf); } u8 RSXTexture::GetAnisoBias() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 4) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 4) & 0xf); } u8 RSXTexture::GetSignedRemap() const { - return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*4)] >> 24) & 0xf); + return ((methodRegisters[NV4097_SET_TEXTURE_ADDRESS + (m_index*32)] >> 24) & 0xf); } bool RSXTexture::IsEnabled() const { - return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 31) & 0x1); + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 31) & 0x1); } u16 RSXTexture::GetMinLOD() const { - return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 19) & 0xfff); + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 19) & 0xfff); } u16 RSXTexture::GetMaxLOD() const { - return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 7) & 0xfff); + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 7) & 0xfff); } u8 RSXTexture::GetMaxAniso() const { - return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 4) & 0x7); + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 4) & 0x7); } bool RSXTexture::IsAlphaKillEnabled() const { - return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*4)] >> 2) & 0x1); + return ((methodRegisters[NV4097_SET_TEXTURE_CONTROL0 + (m_index*32)] >> 2) & 0x1); } u32 RSXTexture::GetRemap() const { - return (methodRegisters[NV4097_SET_TEXTURE_CONTROL1 + (m_index*4)]); + return (methodRegisters[NV4097_SET_TEXTURE_CONTROL1 + (m_index*32)]); +} + +u16 RSXTexture::GetBias() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)]) & 0x1fff); +} + +u8 RSXTexture::GetMinFilter() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 16) & 0x7); +} + +u8 RSXTexture::GetMagFilter() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 24) & 0x7); +} + +u8 RSXTexture::GetConvolutionFilter() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 13) & 0xf); +} + +bool RSXTexture::isASigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 28) & 0x1); +} + +bool RSXTexture::isRSigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 29) & 0x1); +} + +bool RSXTexture::isGSigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 30) & 0x1); +} + +bool RSXTexture::isBSigned() const +{ + return ((methodRegisters[NV4097_SET_TEXTURE_FILTER + (m_index*32)] >> 31) & 0x1); } u16 RSXTexture::GetWidth() const { - return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)] >> 16) & 0xffff); + return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)] >> 16) & 0xffff); } u16 RSXTexture::GetHeight() const { - return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*4)]) & 0xffff); + return ((methodRegisters[NV4097_SET_TEXTURE_IMAGE_RECT + (m_index*32)]) & 0xffff); } void RSXTexture::SetControl3(u16 depth, u32 pitch) { m_depth = depth; m_pitch = pitch; -} - -void RSXTexture::SetFilter(u16 bias, u8 min, u8 mag, u8 conv, u8 a_signed, u8 r_signed, u8 g_signed, u8 b_signed) -{ - m_bias = bias; - m_min_filter = min; - m_mag_filter = mag; - m_conv = conv; - m_a_signed = a_signed; - m_r_signed = r_signed; - m_g_signed = g_signed; - m_b_signed = b_signed; } \ No newline at end of file diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index 4dea573808..9556370bf9 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -288,18 +288,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case_16(NV4097_SET_TEXTURE_FILTER, 0x20): { - RSXTexture& tex = m_textures[index]; - u32 a0 = ARGS(0); - u16 bias = a0 & 0x1fff; - u8 conv = (a0 >> 13) & 0xf; - u8 min = (a0 >> 16) & 0x7; - u8 mag = (a0 >> 24) & 0x7; - u8 a_signed = (a0 >> 28) & 0x1; - u8 r_signed = (a0 >> 29) & 0x1; - u8 g_signed = (a0 >> 30) & 0x1; - u8 b_signed = (a0 >> 31) & 0x1; - - tex.SetFilter(bias, min, mag, conv, a_signed, r_signed, g_signed, b_signed); } break; diff --git a/rpcs3/Emu/GS/RSXThread.h b/rpcs3/Emu/GS/RSXThread.h index b8e93153a9..fd96f49817 100644 --- a/rpcs3/Emu/GS/RSXThread.h +++ b/rpcs3/Emu/GS/RSXThread.h @@ -22,15 +22,6 @@ public: u32 m_pitch; u16 m_depth; - u16 m_bias; - u8 m_min_filter; - u8 m_mag_filter; - u8 m_conv; - u8 m_a_signed; - u8 m_r_signed; - u8 m_g_signed; - u8 m_b_signed; - public: RSXTexture(); RSXTexture(u8 index); @@ -67,12 +58,21 @@ public: // Control1 u32 GetRemap() const; + // Filter + u16 GetBias() const; + u8 GetMinFilter() const; + u8 GetMagFilter() const; + u8 GetConvolutionFilter() const; + bool isASigned() const; + bool isRSigned() const; + bool isGSigned() const; + bool isBSigned() const; + // Image Rect u16 GetWidth() const; u16 GetHeight() const; void SetControl3(u16 depth, u32 pitch); - void SetFilter(u16 bias, u8 min, u8 mag, u8 conv, u8 a_signed, u8 r_signed, u8 g_signed, u8 b_signed); }; struct RSXVertexData From f7967f97ecb120ef79d0d1e57b36bcbfa0351c96 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Fri, 14 Feb 2014 14:50:41 +0200 Subject: [PATCH 11/12] flipped frame buffer --- rpcs3/Emu/GS/GL/GLGSRender.cpp | 47 +++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLGSRender.cpp b/rpcs3/Emu/GS/GL/GLGSRender.cpp index 9d02e706f6..30a2a7c91f 100644 --- a/rpcs3/Emu/GS/GL/GLGSRender.cpp +++ b/rpcs3/Emu/GS/GL/GLGSRender.cpp @@ -12,6 +12,7 @@ #endif gcmBuffer gcmBuffers[8]; +GLuint flipTex; int last_width = 0, last_height = 0, last_depth_format = 0; @@ -85,12 +86,15 @@ GLGSRender::GLGSRender() , m_context(nullptr) { m_frame = new GLGSFrame(); + + glGenTextures(1, &flipTex); } GLGSRender::~GLGSRender() { m_frame->Close(); delete m_context; + glDeleteTextures(1, &flipTex); } void GLGSRender::Enable(bool enable, const u32 cap) @@ -332,8 +336,8 @@ void GLGSRender::InitVertexData() scaleOffsetMat[7] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*1)] - (m_height / 2.0f); scaleOffsetMat[11] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*2)] - 1/2.0f; - scaleOffsetMat[3] /= m_width/2.0f; - scaleOffsetMat[7] /= m_height/2.0f; + scaleOffsetMat[3] /= m_width / 2.0f; + scaleOffsetMat[7] /= m_height / 2.0f; l = m_program.GetLocation("scaleOffsetMat"); glUniformMatrix4fv(l, 1, false, scaleOffsetMat); @@ -1051,7 +1055,7 @@ void GLGSRender::ExecCMD() void GLGSRender::Flip() { - if(m_set_scissor_horizontal && m_set_scissor_vertical) + if(m_set_scissor_horizontal && m_set_scissor_vertical) { glScissor(0, 0, RSXThread::m_width, RSXThread::m_height); checkForGlError("glScissor"); @@ -1082,12 +1086,47 @@ void GLGSRender::Flip() } else if(m_fbo.IsCreated()) { + Array pixels; + pixels.SetCount(m_width * m_height * 4); + m_fbo.Bind(GL_READ_FRAMEBUFFER); + glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr()); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, flipTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, 1, 0, 1, 0, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + GLfbo::Bind(GL_DRAW_FRAMEBUFFER, 0); + + m_program.UnUse(); + m_program.Use(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_ACCUM_BUFFER_BIT); + glBegin(GL_QUADS); + glTexCoord2i(0, 1); + glVertex2i(0, 0); + + glTexCoord2i(1, 1); + glVertex2i(1, 0); + + glTexCoord2i(1, 0); + glVertex2i(1, 1); + + glTexCoord2i(0, 0); + glVertex2i(0, 1); + glEnd(); + + /*GLfbo::Bind(GL_DRAW_FRAMEBUFFER, 0); GLfbo::Blit( m_surface_clip_x, m_surface_clip_y, m_surface_clip_x + m_surface_clip_w, m_surface_clip_y + m_surface_clip_h, m_surface_clip_x, m_surface_clip_y, m_surface_clip_x + m_surface_clip_w, m_surface_clip_y + m_surface_clip_h, - GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); + GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST);*/ m_fbo.Bind(); } From 7f7b12a6dd1c0fab915bfa93cfdc6cb208808d35 Mon Sep 17 00:00:00 2001 From: elisha464 Date: Mon, 17 Feb 2014 23:05:59 +0200 Subject: [PATCH 12/12] a small fix in vertexShaderDecompiler (fixes scogger loading screen) --- rpcs3/Emu/GS/GL/GLVertexProgram.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/GS/GL/GLVertexProgram.cpp b/rpcs3/Emu/GS/GL/GLVertexProgram.cpp index 0c5a3730d7..2c4119d433 100644 --- a/rpcs3/Emu/GS/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/GS/GL/GLVertexProgram.cpp @@ -319,7 +319,7 @@ wxString GLVertexDecompilerThread::BuildCode() wxString f = wxEmptyString; - f += wxString::Format("void %s()\n{\n\tgl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n%sgl_Position = gl_Position * scaleOffsetMat;\n}\n", m_funcs[0].name.wx_str(), BuildFuncBody(m_funcs[0]).wx_str()); + f += wxString::Format("void %s()\n{\n\tgl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n%s\tgl_Position = gl_Position * scaleOffsetMat;\n}\n", m_funcs[0].name.wx_str(), BuildFuncBody(m_funcs[0]).wx_str()); for(uint i=1; i intsCount ? "gl_Position = gl_Position * scaleOffsetMat;" : "") + " return; }", false, true); break; // BRA + case 0x09: AddScaCode("{ " + GetFunc() + "; " + wxString(m_funcs.GetCount() == 1 || m_funcs[1].offset > intsCount ? "gl_Position = gl_Position * scaleOffsetMat;" : "") + " return; }", false, true); break; // BRI : works differently (BRI o[1].x(TR) L0;) case 0x0a: AddScaCode("/*CAL*/ " + GetFunc(), false, true); break; // CAL : works same as BRI case 0x0b: AddScaCode("/*CLI*/ " + GetFunc(), false, true); break; // CLI : works same as BRI - case 0x0c: AddScaCode("return", false, true); break; // RET : works like BRI but shorter (RET o[1].x(TR);) + case 0x0c: AddScaCode("{ " + wxString(m_funcs.GetCount() == 1 || m_funcs[1].offset > intsCount ? "gl_Position = gl_Position * scaleOffsetMat;" : "") + "return; }", false, true); break; // RET : works like BRI but shorter (RET o[1].x(TR);) case 0x0d: AddScaCode("log2(" + GetSRC(2, true) + ")"); break; // LG2 case 0x0e: AddScaCode("exp2(" + GetSRC(2, true) + ")"); break; // EX2 case 0x0f: AddScaCode("sin(" + GetSRC(2, true) + ")"); break; // SIN