forked from suyu/suyu
video_core: Arithmetic overflow warning fix for gl_rasterizer (#1262)
* video_core: Arithmetic overflow fix for gl_rasterizer - Fixed warnings, which were indicating incorrect behavior from integral promotion rules and types larger than those in which arithmetic is typically performed. - Added const for variables where possible and meaningful. * Changed the casts from C to C++ style Changed the C-style casts to C++ casts as proposed. Took also care about signed / unsigned behaviour.
This commit is contained in:
parent
460ebc8187
commit
a8974f0556
1 changed files with 14 additions and 12 deletions
|
@ -152,13 +152,13 @@ void RasterizerOpenGL::SetupVertexArrays() {
|
||||||
const Tegra::GPUVAddr end = regs.vertex_array_limit[index].LimitAddress();
|
const Tegra::GPUVAddr end = regs.vertex_array_limit[index].LimitAddress();
|
||||||
|
|
||||||
if (regs.instanced_arrays.IsInstancingEnabled(index) && vertex_array.divisor != 0) {
|
if (regs.instanced_arrays.IsInstancingEnabled(index) && vertex_array.divisor != 0) {
|
||||||
start += vertex_array.stride * (gpu.state.current_instance / vertex_array.divisor);
|
start += static_cast<Tegra::GPUVAddr>(vertex_array.stride) *
|
||||||
|
(gpu.state.current_instance / vertex_array.divisor);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(end > start);
|
ASSERT(end > start);
|
||||||
u64 size = end - start + 1;
|
const u64 size = end - start + 1;
|
||||||
|
const GLintptr vertex_buffer_offset = buffer_cache.UploadMemory(start, size);
|
||||||
GLintptr vertex_buffer_offset = buffer_cache.UploadMemory(start, size);
|
|
||||||
|
|
||||||
// Bind the vertex array to the buffer at the current offset.
|
// Bind the vertex array to the buffer at the current offset.
|
||||||
glBindVertexBuffer(index, buffer_cache.GetHandle(), vertex_buffer_offset,
|
glBindVertexBuffer(index, buffer_cache.GetHandle(), vertex_buffer_offset,
|
||||||
|
@ -178,7 +178,7 @@ void RasterizerOpenGL::SetupVertexArrays() {
|
||||||
|
|
||||||
void RasterizerOpenGL::SetupShaders() {
|
void RasterizerOpenGL::SetupShaders() {
|
||||||
MICROPROFILE_SCOPE(OpenGL_Shader);
|
MICROPROFILE_SCOPE(OpenGL_Shader);
|
||||||
auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
|
const auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
|
||||||
|
|
||||||
// Next available bindpoints to use when uploading the const buffers and textures to the GLSL
|
// Next available bindpoints to use when uploading the const buffers and textures to the GLSL
|
||||||
// shaders. The constbuffer bindpoint starts after the shader stage configuration bind points.
|
// shaders. The constbuffer bindpoint starts after the shader stage configuration bind points.
|
||||||
|
@ -186,7 +186,7 @@ void RasterizerOpenGL::SetupShaders() {
|
||||||
u32 current_texture_bindpoint = 0;
|
u32 current_texture_bindpoint = 0;
|
||||||
|
|
||||||
for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) {
|
for (size_t index = 0; index < Maxwell::MaxShaderProgram; ++index) {
|
||||||
auto& shader_config = gpu.regs.shader_config[index];
|
const auto& shader_config = gpu.regs.shader_config[index];
|
||||||
const Maxwell::ShaderProgram program{static_cast<Maxwell::ShaderProgram>(index)};
|
const Maxwell::ShaderProgram program{static_cast<Maxwell::ShaderProgram>(index)};
|
||||||
|
|
||||||
// Skip stages that are not enabled
|
// Skip stages that are not enabled
|
||||||
|
@ -198,7 +198,7 @@ void RasterizerOpenGL::SetupShaders() {
|
||||||
|
|
||||||
GLShader::MaxwellUniformData ubo{};
|
GLShader::MaxwellUniformData ubo{};
|
||||||
ubo.SetFromRegs(gpu.state.shader_stages[stage]);
|
ubo.SetFromRegs(gpu.state.shader_stages[stage]);
|
||||||
GLintptr offset = buffer_cache.UploadHostMemory(
|
const GLintptr offset = buffer_cache.UploadHostMemory(
|
||||||
&ubo, sizeof(ubo), static_cast<size_t>(uniform_buffer_alignment));
|
&ubo, sizeof(ubo), static_cast<size_t>(uniform_buffer_alignment));
|
||||||
|
|
||||||
// Bind the buffer
|
// Bind the buffer
|
||||||
|
@ -436,7 +436,7 @@ void RasterizerOpenGL::DrawArrays() {
|
||||||
|
|
||||||
ScopeAcquireGLContext acquire_context{emu_window};
|
ScopeAcquireGLContext acquire_context{emu_window};
|
||||||
|
|
||||||
auto [dirty_color_surface, dirty_depth_surface] =
|
const auto [dirty_color_surface, dirty_depth_surface] =
|
||||||
ConfigureFramebuffers(true, regs.zeta.Address() != 0 && regs.zeta_enable != 0, true);
|
ConfigureFramebuffers(true, regs.zeta.Address() != 0 && regs.zeta_enable != 0, true);
|
||||||
|
|
||||||
SyncDepthTestState();
|
SyncDepthTestState();
|
||||||
|
@ -450,7 +450,8 @@ void RasterizerOpenGL::DrawArrays() {
|
||||||
|
|
||||||
// Draw the vertex batch
|
// Draw the vertex batch
|
||||||
const bool is_indexed = accelerate_draw == AccelDraw::Indexed;
|
const bool is_indexed = accelerate_draw == AccelDraw::Indexed;
|
||||||
const u64 index_buffer_size{regs.index_array.count * regs.index_array.FormatSizeInBytes()};
|
const u64 index_buffer_size{static_cast<u64>(regs.index_array.count) *
|
||||||
|
static_cast<u64>(regs.index_array.FormatSizeInBytes())};
|
||||||
|
|
||||||
state.draw.vertex_buffer = buffer_cache.GetHandle();
|
state.draw.vertex_buffer = buffer_cache.GetHandle();
|
||||||
state.Apply();
|
state.Apply();
|
||||||
|
@ -493,7 +494,8 @@ void RasterizerOpenGL::DrawArrays() {
|
||||||
const GLint base_vertex{static_cast<GLint>(regs.vb_element_base)};
|
const GLint base_vertex{static_cast<GLint>(regs.vb_element_base)};
|
||||||
|
|
||||||
// Adjust the index buffer offset so it points to the first desired index.
|
// Adjust the index buffer offset so it points to the first desired index.
|
||||||
index_buffer_offset += regs.index_array.first * regs.index_array.FormatSizeInBytes();
|
index_buffer_offset += static_cast<GLintptr>(regs.index_array.first) *
|
||||||
|
static_cast<GLintptr>(regs.index_array.FormatSizeInBytes());
|
||||||
|
|
||||||
glDrawElementsBaseVertex(primitive_mode, regs.index_array.count,
|
glDrawElementsBaseVertex(primitive_mode, regs.index_array.count,
|
||||||
MaxwellToGL::IndexFormat(regs.index_array.format),
|
MaxwellToGL::IndexFormat(regs.index_array.format),
|
||||||
|
@ -588,7 +590,7 @@ void RasterizerOpenGL::SamplerInfo::Create() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntry& config) {
|
void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntry& config) {
|
||||||
GLuint s = sampler.handle;
|
const GLuint s = sampler.handle;
|
||||||
|
|
||||||
if (mag_filter != config.mag_filter) {
|
if (mag_filter != config.mag_filter) {
|
||||||
mag_filter = config.mag_filter;
|
mag_filter = config.mag_filter;
|
||||||
|
@ -682,7 +684,7 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, Shader& shader,
|
||||||
|
|
||||||
for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
|
for (u32 bindpoint = 0; bindpoint < entries.size(); ++bindpoint) {
|
||||||
const auto& entry = entries[bindpoint];
|
const auto& entry = entries[bindpoint];
|
||||||
u32 current_bindpoint = current_unit + bindpoint;
|
const u32 current_bindpoint = current_unit + bindpoint;
|
||||||
|
|
||||||
// Bind the uniform to the sampler.
|
// Bind the uniform to the sampler.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue