GSRendererSW::GSRendererSW(int threads) : m_fzb(NULL) { m_nativeres = true; // ignore ini, sw is always native m_tc = new GSTextureCacheSW(this); memset(m_texture, 0, sizeof(m_texture)); m_rl = GSRasterizerList::Create<GSDrawScanline>(threads, &m_perfmon); m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32); for (uint32 i = 0; i < countof(m_fzb_pages); i++) { m_fzb_pages[i] = 0; } for (uint32 i = 0; i < countof(m_tex_pages); i++) { m_tex_pages[i] = 0; } #define InitCVB(P) \ m_cvb[P][0][0] = &GSRendererSW::ConvertVertexBuffer<P, 0, 0>; \ m_cvb[P][0][1] = &GSRendererSW::ConvertVertexBuffer<P, 0, 1>; \ m_cvb[P][1][0] = &GSRendererSW::ConvertVertexBuffer<P, 1, 0>; \ m_cvb[P][1][1] = &GSRendererSW::ConvertVertexBuffer<P, 1, 1>; \ InitCVB(GS_POINT_CLASS); InitCVB(GS_LINE_CLASS); InitCVB(GS_TRIANGLE_CLASS); InitCVB(GS_SPRITE_CLASS); m_dump_root = root_sw; }
GSRendererSW::GSRendererSW(int threads) : m_fzb(NULL) { m_nativeres = true; // ignore ini, sw is always native m_tc = new GSTextureCacheSW(this); memset(m_texture, 0, sizeof(m_texture)); bool spin_thread = !!theApp.GetConfig("spin_thread", 0); m_rl = GSRasterizerList::Create<GSDrawScanline>(threads, &m_perfmon, spin_thread); m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32); memset(m_fzb_pages, 0, sizeof(m_fzb_pages)); memset(m_tex_pages, 0, sizeof(m_tex_pages)); #define InitCVB(P) \ m_cvb[P][0][0] = &GSRendererSW::ConvertVertexBuffer<P, 0, 0>; \ m_cvb[P][0][1] = &GSRendererSW::ConvertVertexBuffer<P, 0, 1>; \ m_cvb[P][1][0] = &GSRendererSW::ConvertVertexBuffer<P, 1, 0>; \ m_cvb[P][1][1] = &GSRendererSW::ConvertVertexBuffer<P, 1, 1>; \ InitCVB(GS_POINT_CLASS); InitCVB(GS_LINE_CLASS); InitCVB(GS_TRIANGLE_CLASS); InitCVB(GS_SPRITE_CLASS); }
GSRendererSW::GSRendererSW(int threads) : m_fzb(NULL) { m_nativeres = true; // ignore ini, sw is always native m_tc = new GSTextureCacheSW(this); memset(m_texture, 0, sizeof(m_texture)); m_rl = GSRasterizerList::Create<GSDrawScanline>(threads, &m_perfmon); m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32); for (uint32 i = 0; i < countof(m_fzb_pages); i++) { m_fzb_pages[i] = 0; } for (uint32 i = 0; i < countof(m_tex_pages); i++) { m_tex_pages[i] = 0; } #define InitCVB2(P, Q) \ m_cvb[P][0][0][Q] = &GSRendererSW::ConvertVertexBuffer<P, 0, 0, Q>; \ m_cvb[P][0][1][Q] = &GSRendererSW::ConvertVertexBuffer<P, 0, 1, Q>; \ m_cvb[P][1][0][Q] = &GSRendererSW::ConvertVertexBuffer<P, 1, 0, Q>; \ m_cvb[P][1][1][Q] = &GSRendererSW::ConvertVertexBuffer<P, 1, 1, Q>; #define InitCVB(P) \ InitCVB2(P, 0) \ InitCVB2(P, 1) InitCVB(GS_POINT_CLASS); InitCVB(GS_LINE_CLASS); InitCVB(GS_TRIANGLE_CLASS); InitCVB(GS_SPRITE_CLASS); m_dump_root = root_sw; // Reset handler with the auto flush hack enabled on the SW renderer // Impact on perf is rather small, and it avoids an extra hack option. if (!GLLoader::in_replayer) { m_userhacks_auto_flush = true; ResetHandlers(); } }
GSRendererCL::GSRendererCL() : m_vb_count(0) , m_synced(true) { m_nativeres = true; // ignore ini, sw is always native memset(m_texture, 0, sizeof(m_texture)); m_output = (uint8*)_aligned_malloc(1024 * 1024 * sizeof(uint32), 32); for(int i = 0; i < 4; i++) { m_rw_pages[0][i] = GSVector4i::zero(); m_rw_pages[1][i] = GSVector4i::zero(); m_tc_pages[i] = GSVector4i::xffffffff(); } memset(m_rw_pages_rendering, 0, sizeof(m_rw_pages_rendering)); #define InitCVB(P) \ m_cvb[P][0][0] = &GSRendererCL::ConvertVertexBuffer<P, 0, 0>; \ m_cvb[P][0][1] = &GSRendererCL::ConvertVertexBuffer<P, 0, 1>; \ m_cvb[P][1][0] = &GSRendererCL::ConvertVertexBuffer<P, 1, 0>; \ m_cvb[P][1][1] = &GSRendererCL::ConvertVertexBuffer<P, 1, 1>; \ InitCVB(GS_POINT_CLASS); InitCVB(GS_LINE_CLASS); InitCVB(GS_TRIANGLE_CLASS); InitCVB(GS_SPRITE_CLASS); // NOTE: m_cl.vm may be cached on the device according to the specs, there are a couple of places where we access m_mem.m_vm8 without // mapping the buffer (after the two invalidate* calls and in getoutput), it is currently not an issue, but on some devices it may be. m_cl.vm = cl::Buffer(m_cl.context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, (size_t)m_mem.m_vmsize, m_mem.m_vm8, NULL); m_cl.tex = cl::Buffer(m_cl.context, CL_MEM_READ_ONLY, (size_t)m_mem.m_vmsize); }