@ -67,7 +67,7 @@ static std::size_t GetConstBufferSize(const Tegra::Engines::ConstBufferInfo& buf
RasterizerOpenGL : : RasterizerOpenGL ( Core : : System & system , Core : : Frontend : : EmuWindow & emu_window ,
RasterizerOpenGL : : RasterizerOpenGL ( Core : : System & system , Core : : Frontend : : EmuWindow & emu_window ,
ScreenInfo & info )
ScreenInfo & info )
: texture_cache { system , * this , device } , shader_cache { * this , system , emu_window , device } ,
: texture_cache { system , * this , device } , shader_cache { * this , system , emu_window , device } ,
system { system } , screen_info { info } , buffer_cache { * this , system , STREAM_BUFFER_SIZE} {
system { system } , screen_info { info } , buffer_cache { * this , system , device, STREAM_BUFFER_SIZE} {
shader_program_manager = std : : make_unique < GLShader : : ProgramManager > ( ) ;
shader_program_manager = std : : make_unique < GLShader : : ProgramManager > ( ) ;
state . draw . shader_program = 0 ;
state . draw . shader_program = 0 ;
state . Apply ( ) ;
state . Apply ( ) ;
@ -558,6 +558,8 @@ void RasterizerOpenGL::DrawPrelude() {
SyncPolygonOffset ( ) ;
SyncPolygonOffset ( ) ;
SyncAlphaTest ( ) ;
SyncAlphaTest ( ) ;
buffer_cache . Acquire ( ) ;
// Draw the vertex batch
// Draw the vertex batch
const bool is_indexed = accelerate_draw = = AccelDraw : : Indexed ;
const bool is_indexed = accelerate_draw = = AccelDraw : : Indexed ;
@ -573,9 +575,11 @@ void RasterizerOpenGL::DrawPrelude() {
( sizeof ( GLShader : : MaxwellUniformData ) + device . GetUniformBufferAlignment ( ) ) *
( sizeof ( GLShader : : MaxwellUniformData ) + device . GetUniformBufferAlignment ( ) ) *
Maxwell : : MaxShaderStage ;
Maxwell : : MaxShaderStage ;
// Add space for at least 18 constant buffers
if ( ! device . HasFastBufferSubData ( ) ) {
buffer_size + = Maxwell : : MaxConstBuffers *
// Add space for at least 18 constant buffers
( Maxwell : : MaxConstBufferSize + device . GetUniformBufferAlignment ( ) ) ;
buffer_size + = Maxwell : : MaxConstBuffers *
( Maxwell : : MaxConstBufferSize + device . GetUniformBufferAlignment ( ) ) ;
}
// Prepare the vertex array.
// Prepare the vertex array.
buffer_cache . Map ( buffer_size ) ;
buffer_cache . Map ( buffer_size ) ;
@ -739,10 +743,12 @@ void RasterizerOpenGL::DispatchCompute(GPUVAddr code_addr) {
state . draw . shader_program = program ;
state . draw . shader_program = program ;
state . draw . program_pipeline = 0 ;
state . draw . program_pipeline = 0 ;
const std : : size_t buffer_size =
if ( ! device . HasFastBufferSubData ( ) ) {
Tegra : : Engines : : KeplerCompute : : NumConstBuffers *
const std : : size_t buffer_size =
( Maxwell : : MaxConstBufferSize + device . GetUniformBufferAlignment ( ) ) ;
Tegra : : Engines : : KeplerCompute : : NumConstBuffers *
buffer_cache . Map ( buffer_size ) ;
( Maxwell : : MaxConstBufferSize + device . GetUniformBufferAlignment ( ) ) ;
buffer_cache . Map ( buffer_size ) ;
}
bind_ubo_pushbuffer . Setup ( 0 ) ;
bind_ubo_pushbuffer . Setup ( 0 ) ;
bind_ssbo_pushbuffer . Setup ( 0 ) ;
bind_ssbo_pushbuffer . Setup ( 0 ) ;
@ -750,7 +756,9 @@ void RasterizerOpenGL::DispatchCompute(GPUVAddr code_addr) {
SetupComputeConstBuffers ( kernel ) ;
SetupComputeConstBuffers ( kernel ) ;
SetupComputeGlobalMemory ( kernel ) ;
SetupComputeGlobalMemory ( kernel ) ;
buffer_cache . Unmap ( ) ;
if ( ! device . HasFastBufferSubData ( ) ) {
buffer_cache . Unmap ( ) ;
}
bind_ubo_pushbuffer . Bind ( ) ;
bind_ubo_pushbuffer . Bind ( ) ;
bind_ssbo_pushbuffer . Bind ( ) ;
bind_ssbo_pushbuffer . Bind ( ) ;
@ -879,7 +887,8 @@ void RasterizerOpenGL::SetupConstBuffer(const Tegra::Engines::ConstBufferInfo& b
const std : : size_t size = Common : : AlignUp ( GetConstBufferSize ( buffer , entry ) , sizeof ( GLvec4 ) ) ;
const std : : size_t size = Common : : AlignUp ( GetConstBufferSize ( buffer , entry ) , sizeof ( GLvec4 ) ) ;
const auto alignment = device . GetUniformBufferAlignment ( ) ;
const auto alignment = device . GetUniformBufferAlignment ( ) ;
const auto [ cbuf , offset ] = buffer_cache . UploadMemory ( buffer . address , size , alignment ) ;
const auto [ cbuf , offset ] = buffer_cache . UploadMemory ( buffer . address , size , alignment , false ,
device . HasFastBufferSubData ( ) ) ;
bind_ubo_pushbuffer . Push ( cbuf , offset , size ) ;
bind_ubo_pushbuffer . Push ( cbuf , offset , size ) ;
}
}