This commit is contained in:
elisha464 2014-02-20 00:41:32 +02:00
commit ab4c4c2fd2
5 changed files with 103 additions and 73 deletions

View File

@ -113,7 +113,20 @@ thread::thread()
void thread::start(std::function<void()> func) void thread::start(std::function<void()> func)
{ // got a crash related with strings { // got a crash related with strings
m_thr = std::thread([this, func]() { NamedThreadBase info(m_name); g_tls_this_thread = &info; func(); }); m_thr = std::thread([this, func]()
{
try
{
NamedThreadBase info(m_name);
g_tls_this_thread = &info;
func();
}
catch(...)
{
ConLog.Error("Crash :(");
terminate();
}
});
} }
void thread::detach() void thread::detach()

View File

@ -60,6 +60,8 @@ public:
thread(const std::string& name); thread(const std::string& name);
thread(); thread();
public:
void start(std::function<void()> func); void start(std::function<void()> func);
void detach(); void detach();
void join(); void join();

View File

@ -13,7 +13,8 @@
#endif #endif
gcmBuffer gcmBuffers[8]; gcmBuffer gcmBuffers[8];
GLuint flipTex; GLuint g_flip_tex;
GLuint g_depth_tex;
int last_width = 0, last_height = 0, last_depth_format = 0; int last_width = 0, last_height = 0, last_depth_format = 0;
@ -87,15 +88,12 @@ GLGSRender::GLGSRender()
, m_context(nullptr) , m_context(nullptr)
{ {
m_frame = new GLGSFrame(); m_frame = new GLGSFrame();
glGenTextures(1, &flipTex);
} }
GLGSRender::~GLGSRender() GLGSRender::~GLGSRender()
{ {
m_frame->Close(); m_frame->Close();
delete m_context; delete m_context;
glDeleteTextures(1, &flipTex);
} }
void GLGSRender::Enable(bool enable, const u32 cap) void GLGSRender::Enable(bool enable, const u32 cap)
@ -310,7 +308,7 @@ void GLGSRender::DisableVertexData()
void GLGSRender::InitVertexData() void GLGSRender::InitVertexData()
{ {
GLfloat scaleOffsetMat[16] = {1.0f, 0.0f, 0.0f, 0.0f, GLfloat scaleOffsetMat[16] = {1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.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, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f}; 0.0f, 0.0f, 0.0f, 1.0f};
int l; int l;
@ -328,17 +326,17 @@ void GLGSRender::InitVertexData()
} }
// Scale // Scale
scaleOffsetMat[0] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_SCALE + (0x4*0)] / (m_width / 2.0f); scaleOffsetMat[0] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_SCALE + (0x4*0)] / (RSXThread::m_width / 2.0f);
scaleOffsetMat[5] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_SCALE + (0x4*1)] / (m_height / 2.0f); scaleOffsetMat[5] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_SCALE + (0x4*1)] / (RSXThread::m_height / 2.0f);
scaleOffsetMat[10] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_SCALE + (0x4*2)]; scaleOffsetMat[10] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_SCALE + (0x4*2)];
// Offset // Offset
scaleOffsetMat[3] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*0)] - (m_width / 2.0f); scaleOffsetMat[3] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*0)] - (RSXThread::m_width / 2.0f);
scaleOffsetMat[7] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*1)] - (m_height / 2.0f); scaleOffsetMat[7] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*1)] - (RSXThread::m_height / 2.0f);
scaleOffsetMat[11] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*2)] - 1/2.0f; scaleOffsetMat[11] = (GLfloat&)methodRegisters[NV4097_SET_VIEWPORT_OFFSET + (0x4*2)] - 1/2.0f;
scaleOffsetMat[3] /= m_width / 2.0f; scaleOffsetMat[3] /= RSXThread::m_width / 2.0f;
scaleOffsetMat[7] /= m_height / 2.0f; scaleOffsetMat[7] /= RSXThread::m_height / 2.0f;
l = m_program.GetLocation("scaleOffsetMat"); l = m_program.GetLocation("scaleOffsetMat");
glUniformMatrix4fv(l, 1, false, scaleOffsetMat); glUniformMatrix4fv(l, 1, false, scaleOffsetMat);
@ -436,9 +434,7 @@ bool GLGSRender::LoadProgram()
{ {
if (program.id == m_program.id && program.modified) if (program.id == m_program.id && program.modified)
{ {
// TODO: This isn't working perfectly. Is there any better/shorter way to update the program. // TODO: This isn't working perfectly. Is there any better/shorter way to update the program
glDetachShader(m_program.id, m_vertex_prog.id);
glDetachShader(m_program.id, m_shader_prog.id);
m_vertex_prog.shader = program.vp_shader; m_vertex_prog.shader = program.vp_shader;
m_shader_prog.shader = program.fp_shader; m_shader_prog.shader = program.fp_shader;
m_vertex_prog.Wait(); m_vertex_prog.Wait();
@ -451,6 +447,8 @@ bool GLGSRender::LoadProgram()
glAttachShader(m_program.id, m_shader_prog.id); glAttachShader(m_program.id, m_shader_prog.id);
glLinkProgram(m_program.id); glLinkProgram(m_program.id);
checkForGlError("glLinkProgram"); checkForGlError("glLinkProgram");
glDetachShader(m_program.id, m_vertex_prog.id);
glDetachShader(m_program.id, m_shader_prog.id);
program.vp_id = m_vertex_prog.id; program.vp_id = m_vertex_prog.id;
program.fp_id = m_shader_prog.id; program.fp_id = m_shader_prog.id;
program.modified = false; program.modified = false;
@ -470,7 +468,7 @@ bool GLGSRender::LoadProgram()
// RSX Debugger // RSX Debugger
if (Ini.GSLogPrograms.GetValue()) if (Ini.GSLogPrograms.GetValue())
{ {
RSXDebuggerProgram program = RSXDebuggerProgram(); RSXDebuggerProgram program;
program.id = m_program.id; program.id = m_program.id;
program.vp_id = m_vertex_prog.id; program.vp_id = m_vertex_prog.id;
program.fp_id = m_shader_prog.id; program.fp_id = m_shader_prog.id;
@ -500,14 +498,11 @@ void GLGSRender::WriteDepthBuffer()
glReadPixels(0, 0, RSXThread::m_width, RSXThread::m_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, &Memory[address]); glReadPixels(0, 0, RSXThread::m_width, RSXThread::m_height, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, &Memory[address]);
checkForGlError("glReadPixels"); checkForGlError("glReadPixels");
GLuint depth_tex; glBindTexture(GL_TEXTURE_2D, g_depth_tex);
glGenTextures(1, &depth_tex);
glBindTexture(GL_TEXTURE_2D, depth_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, RSXThread::m_width, RSXThread::m_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &Memory[address]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, RSXThread::m_width, RSXThread::m_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &Memory[address]);
checkForGlError("glTexImage2D"); checkForGlError("glTexImage2D");
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, &Memory[address]);
checkForGlError("glGetTexImage"); checkForGlError("glGetTexImage");
glDeleteTextures(1, &depth_tex);
} }
void GLGSRender::WriteColourBufferA() void GLGSRender::WriteColourBufferA()
@ -653,10 +648,16 @@ void GLGSRender::OnInitThread()
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0); glSwapInterval(Ini.GSVSyncEnable.GetValue() ? 1 : 0);
glGenTextures(1, &g_depth_tex);
glGenTextures(1, &g_flip_tex);
} }
void GLGSRender::OnExitThread() void GLGSRender::OnExitThread()
{ {
glDeleteTextures(1, &g_flip_tex);
glDeleteTextures(1, &g_depth_tex);
m_program.Delete(); m_program.Delete();
m_rbo.Delete(); m_rbo.Delete();
m_fbo.Delete(); m_fbo.Delete();
@ -804,7 +805,7 @@ void GLGSRender::ExecCMD()
if(m_set_viewport_horizontal && m_set_viewport_vertical) if(m_set_viewport_horizontal && m_set_viewport_vertical)
{ {
//glViewport(m_viewport_x, m_viewport_y, m_viewport_w, m_viewport_h); //glViewport(m_viewport_x, m_viewport_y, m_viewport_w, m_viewport_h);
checkForGlError("glViewport"); //checkForGlError("glViewport");
} }
if(m_set_scissor_horizontal && m_set_scissor_vertical) if(m_set_scissor_horizontal && m_set_scissor_vertical)
@ -1101,40 +1102,47 @@ void GLGSRender::Flip()
glScissor(0, 0, RSXThread::m_width, RSXThread::m_height); glScissor(0, 0, RSXThread::m_width, RSXThread::m_height);
checkForGlError("glScissor"); checkForGlError("glScissor");
} }
static u8* src_buffer = nullptr;
static u32 width = 0;
static u32 height = 0;
if(m_read_buffer) if(m_read_buffer)
{ {
gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr); gcmBuffer* buffers = (gcmBuffer*)Memory.GetMemFromAddr(m_gcm_buffers_addr);
u32 width = re(buffers[m_gcm_current_buffer].width);
u32 height = re(buffers[m_gcm_current_buffer].height);
u32 addr = GetAddress(re(buffers[m_gcm_current_buffer].offset), CELL_GCM_LOCATION_LOCAL); u32 addr = GetAddress(re(buffers[m_gcm_current_buffer].offset), CELL_GCM_LOCATION_LOCAL);
if(Memory.IsGoodAddr(addr)) if(Memory.IsGoodAddr(addr))
{ {
//TODO width = re(buffers[m_gcm_current_buffer].width);
//buffer rotating height = re(buffers[m_gcm_current_buffer].height);
static Array<u8> pixels; src_buffer = (u8*)Memory.VirtualToRealAddr(addr);
pixels.SetCount(width * height * 4); }
u8* src = (u8*)Memory.VirtualToRealAddr(addr); else
{
for(u32 y=0; y<height; ++y) src_buffer = nullptr;
{
memcpy(pixels + (height - y - 1) * width * 4, src + y * width * 4, width * 4);
}
glDrawPixels(width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr());
} }
} }
else if(m_fbo.IsCreated()) else if(m_fbo.IsCreated())
{ {
Array<u8> pixels; static Array<u8> pixels;
pixels.SetCount(m_width * m_height * 4); pixels.SetCount(RSXThread::m_width * RSXThread::m_height * 4);
m_fbo.Bind(GL_READ_FRAMEBUFFER); m_fbo.Bind(GL_READ_FRAMEBUFFER);
glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr()); glReadPixels(0, 0, RSXThread::m_width, RSXThread::m_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr());
src_buffer = pixels.GetPtr();
width = RSXThread::m_width;
height = RSXThread::m_height;
}
else
src_buffer = nullptr;
if(src_buffer)
{
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, flipTex); glBindTexture(GL_TEXTURE_2D, g_flip_tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels.GetPtr()); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, src_buffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@ -1149,28 +1157,30 @@ void GLGSRender::Flip()
m_program.UnUse(); m_program.UnUse();
m_program.Use(); m_program.Use();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_ACCUM_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_ACCUM_BUFFER_BIT);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glTexCoord2i(0, 1); glTexCoord2i(0, 1);
glVertex2i(0, 0); glVertex2i(0, 0);
glTexCoord2i(1, 1); glTexCoord2i(1, 1);
glVertex2i(1, 0); glVertex2i(1, 0);
glTexCoord2i(1, 0); glTexCoord2i(1, 0);
glVertex2i(1, 1); glVertex2i(1, 1);
glTexCoord2i(0, 0); glTexCoord2i(0, 0);
glVertex2i(0, 1); glVertex2i(0, 1);
glEnd(); 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);*/
m_fbo.Bind();
} }
/*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);*/
if(m_fbo.IsCreated())
m_fbo.Bind();
for(uint i=0; i<m_post_draw_objs.GetCount(); ++i) for(uint i=0; i<m_post_draw_objs.GetCount(); ++i)
{ {
m_post_draw_objs[i].Draw(); m_post_draw_objs[i].Draw();
@ -1181,7 +1191,7 @@ void GLGSRender::Flip()
if(m_fbo.IsCreated()) if(m_fbo.IsCreated())
m_fbo.Bind(); m_fbo.Bind();
if(m_set_scissor_horizontal && m_set_scissor_vertical) if(m_set_scissor_horizontal && m_set_scissor_vertical)
{ {
glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h); glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h);
checkForGlError("glScissor"); checkForGlError("glScissor");

View File

@ -53,6 +53,8 @@ void GLProgram::Create(const u32 vp, const u32 fp)
glGetProgramInfoLog(id, bufLength, NULL, buf); glGetProgramInfoLog(id, bufLength, NULL, buf);
ConLog.Error("Could not link program: %s", wxString(buf).wx_str()); ConLog.Error("Could not link program: %s", wxString(buf).wx_str());
delete[] buf; delete[] buf;
return;
} }
} }
//else ConLog.Write("program linked!"); //else ConLog.Write("program linked!");
@ -70,8 +72,13 @@ void GLProgram::Create(const u32 vp, const u32 fp)
glGetProgramInfoLog(id, bufLength, NULL, buf); glGetProgramInfoLog(id, bufLength, NULL, buf);
ConLog.Error("Could not link program: %s", wxString(buf).wx_str()); ConLog.Error("Could not link program: %s", wxString(buf).wx_str());
delete[] buf; delete[] buf;
return;
} }
} }
glDetachShader(id, vp);
glDetachShader(id, fp);
} }
void GLProgram::UnUse() void GLProgram::UnUse()

View File

@ -495,15 +495,13 @@ void RSXDebugger::GetPrograms()
if (!RSXReady()) return; if (!RSXReady()) return;
m_list_programs->DeleteAllItems(); m_list_programs->DeleteAllItems();
int i=0;
for (auto& program : m_debug_programs) for (auto& program : m_debug_programs)
{ {
m_list_programs->InsertItem(i, wxString::Format("%d", program.id)); const int i = m_list_programs->InsertItem(m_list_programs->GetItemCount(), wxString::Format("%u", program.id));
m_list_programs->SetItem(i, 1, wxString::Format("%d", program.vp_id)); m_list_programs->SetItem(i, 1, wxString::Format("%u", program.vp_id));
m_list_programs->SetItem(i, 2, wxString::Format("%d", program.fp_id)); m_list_programs->SetItem(i, 2, wxString::Format("%u", program.fp_id));
m_list_programs->SetItem(i, 3, wxString::Format("%d", program.vp_shader.length())); m_list_programs->SetItem(i, 3, wxString::Format("%llu", (u64)program.vp_shader.length()));
m_list_programs->SetItem(i, 4, wxString::Format("%d", program.fp_shader.length())); m_list_programs->SetItem(i, 4, wxString::Format("%llu", (u64)program.fp_shader.length()));
i++;
} }
} }
@ -654,27 +652,27 @@ void RSXDebugger::SetPrograms(wxListEvent& event)
// Program Editor // Program Editor
wxString title = wxString::Format("Program ID: %d (VP:%d, FP:%d)", program.id, program.vp_id, program.fp_id); wxString title = wxString::Format("Program ID: %d (VP:%d, FP:%d)", program.id, program.vp_id, program.fp_id);
wxDialog* d_editor = new wxDialog(this, wxID_ANY, title, wxDefaultPosition, wxSize(800,500), wxDialog d_editor(this, wxID_ANY, title, wxDefaultPosition, wxSize(800,500),
wxDEFAULT_DIALOG_STYLE | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER); wxDEFAULT_DIALOG_STYLE | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxRESIZE_BORDER);
wxBoxSizer& s_panel = *new wxBoxSizer(wxHORIZONTAL); wxBoxSizer& s_panel = *new wxBoxSizer(wxHORIZONTAL);
wxStaticBoxSizer& s_vp_box = *new wxStaticBoxSizer(wxHORIZONTAL, d_editor, "Vertex Program"); wxStaticBoxSizer& s_vp_box = *new wxStaticBoxSizer(wxHORIZONTAL, &d_editor, "Vertex Program");
wxStaticBoxSizer& s_fp_box = *new wxStaticBoxSizer(wxHORIZONTAL, d_editor, "Fragment Program"); wxStaticBoxSizer& s_fp_box = *new wxStaticBoxSizer(wxHORIZONTAL, &d_editor, "Fragment Program");
wxTextCtrl* t_vp_edit = new wxTextCtrl(d_editor, -1, program.vp_shader, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); wxTextCtrl* t_vp_edit = new wxTextCtrl(&d_editor, wxID_ANY, program.vp_shader, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
wxTextCtrl* t_fp_edit = new wxTextCtrl(d_editor, -1, program.fp_shader, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); wxTextCtrl* t_fp_edit = new wxTextCtrl(&d_editor, wxID_ANY, program.fp_shader, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
t_vp_edit->SetFont(wxFont(8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); t_vp_edit->SetFont(wxFont(8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
t_fp_edit->SetFont(wxFont(8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL)); t_fp_edit->SetFont(wxFont(8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
s_vp_box.Add(t_vp_edit, 1, wxEXPAND); s_vp_box.Add(t_vp_edit, 1, wxEXPAND);
s_fp_box.Add(t_fp_edit, 1, wxEXPAND); s_fp_box.Add(t_fp_edit, 1, wxEXPAND);
s_panel.Add(&s_vp_box, 1, wxEXPAND); s_panel.Add(&s_vp_box, 1, wxEXPAND);
s_panel.Add(&s_fp_box, 1, wxEXPAND); s_panel.Add(&s_fp_box, 1, wxEXPAND);
d_editor->SetSizer(&s_panel); d_editor.SetSizer(&s_panel);
// Show editor and open Save Dialog when closing // Show editor and open Save Dialog when closing
if (d_editor->ShowModal()) if (d_editor.ShowModal())
{ {
wxMessageDialog* d_save = new wxMessageDialog(d_editor, "Save changes and compile shaders?", title, wxYES_NO|wxCENTRE); wxMessageDialog d_save(&d_editor, "Save changes and compile shaders?", title, wxYES_NO|wxCENTRE);
if(d_save->ShowModal() == wxID_YES) if(d_save.ShowModal() == wxID_YES)
{ {
program.modified = true; program.modified = true;
program.vp_shader = t_vp_edit->GetValue(); program.vp_shader = t_vp_edit->GetValue();