Implemented fragment constants loading (OpenGL renderer)

Fixed nv308a::color
Minor improvements
This commit is contained in:
DH 2015-10-07 17:36:26 +03:00
parent 86720f90cd
commit cc0c3fc98d
5 changed files with 44 additions and 38 deletions

View file

@ -136,13 +136,13 @@ void VertexProgramDecompiler::SetDST(bool is_sca, std::string value)
std::string mask = GetMask(is_sca); std::string mask = GetMask(is_sca);
value += mask; if (is_sca)
if (is_sca && d0.vec_result)
{ {
//value = "vec4(" + value + ")"; value = getFloatTypeName(4) + "(" + value + ")";
} }
value += mask;
if (d0.staturate) if (d0.staturate)
{ {
value = "clamp(" + value + ", 0.0, 1.0)"; value = "clamp(" + value + ", 0.0, 1.0)";
@ -309,7 +309,7 @@ void VertexProgramDecompiler::AddCodeCond(const std::string& dst, const std::str
if (dst_var.swizzles[0].length() == 1) if (dst_var.swizzles[0].length() == 1)
{ {
AddCode("if (" + cond + ".x) " + dst + " = " + getFloatTypeName(4) + "(" + src + ".xxxx).x;"); AddCode("if (" + cond + ".x) " + dst + " = " + src + ";");
} }
else else
{ {
@ -559,7 +559,7 @@ std::string VertexProgramDecompiler::Decompile()
case RSX_SCA_OPCODE_MOV: SetDSTSca("$s"); break; case RSX_SCA_OPCODE_MOV: SetDSTSca("$s"); break;
case RSX_SCA_OPCODE_RCP: SetDSTSca("(1.0 / $s)"); break; case RSX_SCA_OPCODE_RCP: SetDSTSca("(1.0 / $s)"); break;
case RSX_SCA_OPCODE_RCC: SetDSTSca("clamp(1.0 / $s, 5.42101e-20, 1.884467e19)"); break; case RSX_SCA_OPCODE_RCC: SetDSTSca("clamp(1.0 / $s, 5.42101e-20, 1.884467e19)"); break;
case RSX_SCA_OPCODE_RSQ: SetDSTSca("1.f / sqrt($s)"); break; case RSX_SCA_OPCODE_RSQ: SetDSTSca("(1.f / sqrt($s))"); break;
case RSX_SCA_OPCODE_EXP: SetDSTSca("exp($s)"); break; case RSX_SCA_OPCODE_EXP: SetDSTSca("exp($s)"); break;
case RSX_SCA_OPCODE_LOG: SetDSTSca("log($s)"); break; case RSX_SCA_OPCODE_LOG: SetDSTSca("log($s)"); break;
case RSX_SCA_OPCODE_LIT: SetDSTSca(getFloatTypeName(4) + "(1.0, $s.x, ($s.x > 0.0 ? exp($s.w * log2($s.y)) : 0.0), 1.0)"); break; case RSX_SCA_OPCODE_LIT: SetDSTSca(getFloatTypeName(4) + "(1.0, $s.x, ($s.x > 0.0 ? exp($s.w * log2($s.y)) : 0.0), 1.0)"); break;

View file

@ -498,9 +498,9 @@ struct CellGcmSurface
struct CellGcmReportData struct CellGcmReportData
{ {
u64 timer; be_t<u64> timer;
u32 value; be_t<u32> value;
u32 padding; be_t<u32> padding;
}; };
struct CellGcmZcullInfo struct CellGcmZcullInfo

View file

@ -578,9 +578,9 @@ void GLGSRender::begin()
u32 color_mask = rsx::method_registers[NV4097_SET_COLOR_MASK]; u32 color_mask = rsx::method_registers[NV4097_SET_COLOR_MASK];
bool color_mask_b = color_mask & 0xff; bool color_mask_b = color_mask & 0xff;
bool color_mask_g = color_mask >> 8; bool color_mask_g = (color_mask >> 8) & 0xff;
bool color_mask_r = color_mask >> 16; bool color_mask_r = (color_mask >> 16) & 0xff;
bool color_mask_a = color_mask >> 24; bool color_mask_a = (color_mask >> 24) & 0xff;
__glcheck glColorMask(color_mask_r, color_mask_g, color_mask_b, color_mask_a); __glcheck glColorMask(color_mask_r, color_mask_g, color_mask_b, color_mask_a);
__glcheck glDepthMask(rsx::method_registers[NV4097_SET_DEPTH_MASK]); __glcheck glDepthMask(rsx::method_registers[NV4097_SET_DEPTH_MASK]);
@ -1035,7 +1035,7 @@ void GLGSRender::end()
if (vertex_index_array.empty()) if (vertex_index_array.empty())
{ {
glDrawArrays(draw_mode - 1, 0, vertex_draw_count); draw_fbo.draw_arrays(gl::draw_mode(draw_mode - 1), vertex_draw_count);\
} }
else else
{ {
@ -1158,11 +1158,7 @@ void nv4097_clear_surface(u32 arg, GLGSRender* renderer)
} }
renderer->clear_surface_buffers = (gl::buffers)mask; renderer->clear_surface_buffers = (gl::buffers)mask;
//renderer->init_buffers(); renderer->draw_fbo.clear((gl::buffers)mask);
//renderer->draw_fbo.draw_buffer(renderer->draw_fbo.color[0]);
//renderer->draw_fbo.clear(gl::buffers(mask));
//renderer->draw_fbo.draw_arrays(gl::draw_mode::lines, 0);
//renderer->write_buffers();
} }
using rsx_method_impl_t = void(*)(u32, GLGSRender*); using rsx_method_impl_t = void(*)(u32, GLGSRender*);
@ -1291,6 +1287,18 @@ bool GLGSRender::load_program()
__glcheck m_program.uniforms["vc[" + std::to_string(constant.first) + "]"] = constant.second; __glcheck m_program.uniforms["vc[" + std::to_string(constant.first) + "]"] = constant.second;
} }
for (u32 constant_offset : m_prog_buffer.getFragmentConstantOffsetsCache(&fragment_program))
{
be_t<u32> *data = vm::get_ptr<be_t<u32>>(fragment_program.addr + constant_offset);
u32 c0 = (data[0] >> 16 | data[0] << 16);
u32 c1 = (data[1] >> 16 | data[1] << 16);
u32 c2 = (data[2] >> 16 | data[2] << 16);
u32 c3 = (data[3] >> 16 | data[3] << 16);
m_program.uniforms["fc" + std::to_string(constant_offset)] = color4f{ (f32&)c0, (f32&)c1, (f32&)c2, (f32&)c3 };
}
return true; return true;
} }
@ -1461,11 +1469,11 @@ void GLGSRender::init_buffers()
case CELL_GCM_SURFACE_TARGET_NONE: break; case CELL_GCM_SURFACE_TARGET_NONE: break;
case CELL_GCM_SURFACE_TARGET_0: case CELL_GCM_SURFACE_TARGET_0:
__glcheck draw_fbo.draw_buffers({ draw_fbo.color[0] }); __glcheck draw_fbo.draw_buffer(draw_fbo.color[0]);
break; break;
case CELL_GCM_SURFACE_TARGET_1: case CELL_GCM_SURFACE_TARGET_1:
__glcheck draw_fbo.draw_buffers({ draw_fbo.color[1] }); __glcheck draw_fbo.draw_buffer(draw_fbo.color[1] );
break; break;
case CELL_GCM_SURFACE_TARGET_MRT1: case CELL_GCM_SURFACE_TARGET_MRT1:
@ -1487,7 +1495,7 @@ void GLGSRender::init_buffers()
if (clear_surface_buffers != gl::buffers::none) if (clear_surface_buffers != gl::buffers::none)
{ {
draw_fbo.clear(clear_surface_buffers); //draw_fbo.clear(clear_surface_buffers);
clear_surface_buffers = gl::buffers::none; clear_surface_buffers = gl::buffers::none;
} }
@ -1707,6 +1715,8 @@ void GLGSRender::flip(int buffer)
if (draw_fbo && !Ini.GSDumpColorBuffers.GetValue()) if (draw_fbo && !Ini.GSDumpColorBuffers.GetValue())
{ {
skip_read = true;
/*
for (uint i = 0; i < rsx::limits::color_buffers_count; ++i) for (uint i = 0; i < rsx::limits::color_buffers_count; ++i)
{ {
u32 color_address = rsx::get_address(rsx::method_registers[mr_color_offset[i]], rsx::method_registers[mr_color_dma[i]]); u32 color_address = rsx::get_address(rsx::method_registers[mr_color_offset[i]], rsx::method_registers[mr_color_dma[i]]);
@ -1718,6 +1728,7 @@ void GLGSRender::flip(int buffer)
break; break;
} }
} }
*/
} }
if (!skip_read) if (!skip_read)

View file

@ -47,13 +47,13 @@ namespace rsx
__forceinline void semaphore_acquire(thread* rsx, u32 arg) __forceinline void semaphore_acquire(thread* rsx, u32 arg)
{ {
//TODO: dma //TODO: dma
/*while (vm::read32(rsx->label_addr + method_registers[NV406E_SEMAPHORE_OFFSET]) != arg) while (vm::read32(rsx->label_addr + method_registers[NV406E_SEMAPHORE_OFFSET]) != arg)
{ {
if (Emu.IsStopped()) if (Emu.IsStopped())
break; break;
std::this_thread::sleep_for(std::chrono::milliseconds(1)); std::this_thread::sleep_for(std::chrono::milliseconds(1));
}*/ }
} }
__forceinline void semaphore_release(thread* rsx, u32 arg) __forceinline void semaphore_release(thread* rsx, u32 arg)
@ -246,7 +246,11 @@ namespace rsx
u8 type = arg >> 24; u8 type = arg >> 24;
u32 offset = arg & 0xffffff; u32 offset = arg & 0xffffff;
u32 value; //TODO: use DMA
vm::ptr<CellGcmReportData> result = { rsx->local_mem_addr + offset };
result->timer = rsx->timestamp();
switch (type) switch (type)
{ {
case CELL_GCM_ZPASS_PIXEL_CNT: case CELL_GCM_ZPASS_PIXEL_CNT:
@ -254,24 +258,17 @@ namespace rsx
case CELL_GCM_ZCULL_STATS1: case CELL_GCM_ZCULL_STATS1:
case CELL_GCM_ZCULL_STATS2: case CELL_GCM_ZCULL_STATS2:
case CELL_GCM_ZCULL_STATS3: case CELL_GCM_ZCULL_STATS3:
value = 0; result->value = 0;
LOG_WARNING(RSX, "NV4097_GET_REPORT: Unimplemented type %d", type); LOG_WARNING(RSX, "NV4097_GET_REPORT: Unimplemented type %d", type);
break; break;
default: default:
value = 0; result->value = 0;
LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type); LOG_ERROR(RSX, "NV4097_GET_REPORT: Bad type %d", type);
break; break;
} }
// NOTE: DMA broken, implement proper lpar mapping (sys_rsx) //result->padding = 0;
//dma_write64(dma_report, offset + 0x0, rsx->timestamp());
//dma_write32(dma_report, offset + 0x8, value);
//dma_write32(dma_report, offset + 0xc, 0);
vm::write64(rsx->local_mem_addr + offset + 0x0, rsx->timestamp());
vm::write32(rsx->local_mem_addr + offset + 0x8, value);
vm::write32(rsx->local_mem_addr + offset + 0xc, 0);
} }
__forceinline void clear_report_value(thread* rsx, u32 arg) __forceinline void clear_report_value(thread* rsx, u32 arg)
@ -305,7 +302,7 @@ namespace rsx
LOG_ERROR(RSX, "%s: y is not null (0x%x)", __FUNCTION__, y); LOG_ERROR(RSX, "%s: y is not null (0x%x)", __FUNCTION__, y);
} }
u32 address = get_address(method_registers[NV3062_SET_OFFSET_DESTIN] + (x << 2) + index, method_registers[NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN]); u32 address = get_address(method_registers[NV3062_SET_OFFSET_DESTIN] + (x << 2) + index * 4, method_registers[NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN]);
vm::write32(address, arg); vm::write32(address, arg);
} }
} }
@ -916,7 +913,6 @@ namespace rsx
for (auto &vertex_array : vertex_arrays) for (auto &vertex_array : vertex_arrays)
vertex_array.clear(); vertex_array.clear();
fragment_constants.clear();
transform_constants.clear(); transform_constants.clear();
} }

View file

@ -159,7 +159,6 @@ namespace rsx
std::vector<u8> vertex_index_array; std::vector<u8> vertex_index_array;
u32 vertex_draw_count = 0; u32 vertex_draw_count = 0;
std::unordered_map<u32, color4_base<f32>> fragment_constants;
std::unordered_map<u32, color4_base<f32>> transform_constants; std::unordered_map<u32, color4_base<f32>> transform_constants;
u32 transform_program[512 * 4] = {}; u32 transform_program[512 * 4] = {};