diff --git a/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp b/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp index c8cde0fdf4..89b684c5ee 100644 --- a/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/GL/GLCommonDecompiler.cpp @@ -76,4 +76,5 @@ std::string compareFunctionImpl(COMPARE f, const std::string &Op0, const std::st case COMPARE::FUNCTION_SNE: return "notEqual(" + Op0 + ", " + Op1 + ")"; } + throw EXCEPTION("Unknow compare function"); } diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 7d343de314..f99e22c546 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -217,7 +217,7 @@ void GLFragmentProgram::Compile() id = glCreateShader(GL_FRAGMENT_SHADER); const char* str = shader.c_str(); - const int strlen = shader.length(); + const int strlen = gsl::narrow(shader.length()); glShaderSource(id, 1, &str, &strlen); glCompileShader(id); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 98b52debaf..5ee19311a7 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -57,10 +57,10 @@ void GLGSRender::begin() init_buffers(); u32 color_mask = rsx::method_registers[NV4097_SET_COLOR_MASK]; - bool color_mask_b = color_mask & 0xff; - bool color_mask_g = (color_mask >> 8) & 0xff; - bool color_mask_r = (color_mask >> 16) & 0xff; - bool color_mask_a = (color_mask >> 24) & 0xff; + bool color_mask_b = !!(color_mask & 0xff); + bool color_mask_g = !!((color_mask >> 8) & 0xff); + bool color_mask_r = !!((color_mask >> 16) & 0xff); + bool color_mask_a = !!((color_mask >> 24) & 0xff); __glcheck glColorMask(color_mask_r, color_mask_g, color_mask_b, color_mask_a); __glcheck glDepthMask(rsx::method_registers[NV4097_SET_DEPTH_MASK]); @@ -307,6 +307,7 @@ namespace case Vertex_base_type::cmp: return gl::buffer_pointer::type::s16; // Needs conversion case Vertex_base_type::ub256: gl::buffer_pointer::type::u8; } + throw EXCEPTION("unknow vertex type"); } bool gl_normalized(Vertex_base_type type) @@ -323,6 +324,7 @@ namespace case Vertex_base_type::s32k: return false; } + throw EXCEPTION("unknow vertex type"); } } @@ -359,7 +361,7 @@ void GLGSRender::end() //merge all vertex arrays std::vector vertex_arrays_data; - size_t vertex_arrays_offsets[rsx::limits::vertex_count]; + u32 vertex_arrays_offsets[rsx::limits::vertex_count]; const std::string reg_table[] = { @@ -380,7 +382,7 @@ void GLGSRender::end() if (draw_command == Draw_command::draw_command_indexed) { Index_array_type type = to_index_array_type(rsx::method_registers[NV4097_SET_INDEX_ARRAY_DMA] >> 4); - u32 type_size = get_index_type_size(type); + u32 type_size = gsl::narrow(get_index_type_size(type)); for (const auto& first_count : first_count_commands) { vertex_draw_count += first_count.second; @@ -402,7 +404,7 @@ void GLGSRender::end() if (draw_command == Draw_command::draw_command_inlined_array) { write_inline_array_to_buffer(vertex_arrays_data.data()); - size_t offset = 0; + u32 offset = 0; for (int index = 0; index < rsx::limits::vertex_count; ++index) { auto &vertex_info = vertex_arrays_info[index]; @@ -467,7 +469,7 @@ void GLGSRender::end() size_t size = vertex_array.size(); size_t position = vertex_arrays_data.size(); - vertex_arrays_offsets[index] = position; + vertex_arrays_offsets[index] = gsl::narrow(position); vertex_arrays_data.resize(position + size); memcpy(vertex_arrays_data.data() + position, vertex_array.data(), size); diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index 5b2fcaefaa..7fcb207e89 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -200,7 +200,7 @@ void GLVertexProgram::Compile() id = glCreateShader(GL_VERTEX_SHADER); const char* str = shader.c_str(); - const int strlen = shader.length(); + const int strlen = gsl::narrow(shader.length()); glShaderSource(id, 1, &str, &strlen); glCompileShader(id); diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.h b/rpcs3/Emu/RSX/GL/gl_helpers.h index bae1a00c52..7862e202d6 100644 --- a/rpcs3/Emu/RSX/GL/gl_helpers.h +++ b/rpcs3/Emu/RSX/GL/gl_helpers.h @@ -382,7 +382,7 @@ namespace gl private: GLuint m_id = GL_NONE; - GLsizei m_size = 0; + GLsizeiptr m_size = 0; target m_target = target::array; public: @@ -494,7 +494,7 @@ namespace gl m_id = 0; } - GLsizei size() const + GLsizeiptr size() const { return m_size; } diff --git a/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp b/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp index 132378acdd..48cdaf24f2 100644 --- a/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp +++ b/rpcs3/Emu/RSX/GL/rsx_gl_texture.cpp @@ -108,7 +108,7 @@ namespace rsx u32 full_format = tex.format(); u32 format = full_format & ~(CELL_GCM_TEXTURE_LN | CELL_GCM_TEXTURE_UN); - bool is_swizzled = ~full_format & CELL_GCM_TEXTURE_LN; + bool is_swizzled = !!(~full_format & CELL_GCM_TEXTURE_LN); const u8* pixels = vm::ps3::_ptr(texaddr); u8 *unswizzledPixels; @@ -462,7 +462,7 @@ namespace rsx glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, gl_tex_zfunc[tex.zfunc()]); - glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, tex.bias()); + glTexEnvi(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, (GLint)tex.bias()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, (tex.min_lod() >> 8)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, (tex.max_lod() >> 8)); diff --git a/rpcs3/Emu/RSX/rsx_utils.h b/rpcs3/Emu/RSX/rsx_utils.h index bb8b08ed45..070b3c5874 100644 --- a/rpcs3/Emu/RSX/rsx_utils.h +++ b/rpcs3/Emu/RSX/rsx_utils.h @@ -32,15 +32,15 @@ namespace rsx template void convert_linear_swizzle(void* input_pixels, void* output_pixels, u16 width, u16 height, bool input_is_swizzled) { - u32 log2width = log2(width); - u32 log2height = log2(height); + u16 log2width = gsl::narrow(ceil(log2(width))); + u16 log2height = gsl::narrow(ceil(log2(height))); // Max mask possible for square texture u32 x_mask = 0x55555555; u32 y_mask = 0xAAAAAAAA; // We have to limit the masks to the lower of the two dimensions to allow for non-square textures - u32 limit_mask = (log2width < log2height) ? log2width : log2height; + u16 limit_mask = (log2width < log2height) ? log2width : log2height; // double the limit mask to account for bits in both x and y limit_mask = 1 << (limit_mask << 1); diff --git a/rpcs3/GLGSRender.vcxproj b/rpcs3/GLGSRender.vcxproj index 45cd8a0696..7e0ba6601a 100644 --- a/rpcs3/GLGSRender.vcxproj +++ b/rpcs3/GLGSRender.vcxproj @@ -61,6 +61,11 @@ + + + true + + {c4a10229-4712-4bd2-b63e-50d93c67a038}