Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fall back to RGBA 8888 color mode on GL_FRAMEBUFFER_UNSUPPORTED. #228

Closed
wants to merge 1 commit into from

Conversation

juhalaukkanen
Copy link

Fixes Gradius I/II/Gaiden (Gradius Collection PSP)

@unknownbrackets
Copy link
Contributor

What specifically does this fix? Normally (unless you change the ini manually), ppsspp uses 8888 for all the main drawing FBOs.

-[Unknown]

@juhalaukkanen
Copy link
Author

For some reason Gradius Collection uses implicit mode selection for these games. Only Gradius III works differently. I haven't checked why.

However at least my OGL implementation does not support request with 5551 color combination. That's why this option falls back to 8888 on those cases.

@unknownbrackets
Copy link
Contributor

What do you mean by implicit mode selection? What's the stack trace? I'm mostly interested in who is calling fbo_create().

What graphics card / driver are you using? What platform?

-[Unknown]

@hrydgard
Copy link
Owner

hrydgard commented Aug 9, 2014

Even if we really were creating 5551 buffers, this would not be a correct way to fall back to 8888. So I don't understand this change either.

@juhalaukkanen
Copy link
Author

Well I agree that this fix is rather obscure and most likely a hack.

I need to investigate this a bit more to fully understand how these games create fb and how it is so different from Gradius III.

@juhalaukkanen
Copy link
Author

Sorry to be really like super late with this issue. It took like 10 months. lolled

So Gradius Collection needs this 'Block Transfer' feature. Now at FramebufferCommon.cpp line 722

ReadFramebufferToMemory(srcBuffer, true, static_cast(srcX * srcXFactor), srcY, static_cast(srcWidth * srcXFactor), srcHeight);

Then Framebuffer.cpp -> ShouldDownloadUsingCPU(vfb) -> false since NVIDIA GPU -> fbo_create is then called with GE_FORMAT_5551 opposed to GE_FORMAT_8888.

Now that format returns GL_FRAMEBUFFER_UNSUPPORTED at least on MBP with Nvidia 9400M GPU.

I tested on Linux with Intel 3000 GPU by a hack if GE_FORMAT_5551 would be okay, and no problems. It is fine.

So now I am not sure if,

  1. Apple OSX drivers don't generally support GE_FORMAT_5551
  2. The specific 9400M Nvidia doesn't support it

Someone else noticed also this: http://forums.ppsspp.org/showthread.php?tid=1591&pid=102389#pid102389

So this should be fixed accordingly.

@hrydgard
Copy link
Owner

Aha! Very good diagnosis, I didn't realize we actually used 16-bit fbos in frame download.

So hm, I wonder what the GPU version cutoff is from where it's working? Do you think you could post what you see if you go to Settings->System->Developer Tools->System Information?

We can simply check if the gl version or gpu or something is less than a specific value, and in that case have ShouldDownloadUsingCPU return true.

@juhalaukkanen
Copy link
Author

Here is a dump.

Model: NVIDIA GeForce 9400M OpenGL Engine
API Version: 2.1 NVIDIA-10.0.31 310.90.10.0
Shading Language: 1.20

GL_ARB_color_buffer_float
GL_ARB_depth_buffer_float
GL_ARB_depth_clamp
GL_ARB_depth_texture
GL_ARB_draw_buffers
GL_ARB_draw_elements_base_vertex
GL_ARB_draw_instanced
GL_ARB_fragment_program
GL_ARB_fragment_program_shadow
GL_ARB_fragment_shader
GL_ARB_framebuffer_object
GL_ARB_framebuffer_sRGB
GL_ARB_half_float_pixel
GL_ARB_half_float_vertex
GL_ARB_imaging
GL_ARB_instanced_arrays
GL_ARB_multisample
GL_ARB_multitexture
GL_ARB_occlusion_query
GL_ARB_pixel_buffer_object
GL_ARB_point_parameters
GL_ARB_point_sprite
GL_ARB_provoking_vertex
GL_ARB_seamless_cube_map
GL_ARB_shader_objects
GL_ARB_shader_texture_lod
GL_ARB_shading_language_100
GL_ARB_shadow
GL_ARB_sync
GL_ARB_texture_border_clamp
GL_ARB_texture_compression
GL_ARB_texture_compression_rgtc
GL_ARB_texture_cube_map
GL_ARB_texture_env_add
GL_ARB_texture_env_combine
GL_ARB_texture_env_crossbar
GL_ARB_texture_env_dot3
GL_ARB_texture_float
GL_ARB_texture_mirrored_repeat
GL_ARB_texture_non_power_of_two
GL_ARB_texture_rectangle
GL_ARB_texture_rg
GL_ARB_transpose_matrix
GL_ARB_vertex_array_bgra
GL_ARB_vertex_blend
GL_ARB_vertex_buffer_object
GL_ARB_vertex_program
GL_ARB_vertex_shader
GL_ARB_window_pos
GL_EXT_abgr
GL_EXT_bgra
GL_EXT_bindable_uniform
GL_EXT_blend_color
GL_EXT_blend_equation_separate
GL_EXT_blend_func_separate
GL_EXT_blend_minmax
GL_EXT_blend_subtract
GL_EXT_clip_volume_hint
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_depth_bounds_test
GL_EXT_draw_buffers2
GL_EXT_draw_range_elements
GL_EXT_fog_coord
GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample
GL_EXT_framebuffer_multisample_blit_scaled
GL_EXT_framebuffer_object
GL_EXT_framebuffer_sRGB
GL_EXT_geometry_shader4
GL_EXT_gpu_program_parameters
GL_EXT_gpu_shader4
GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil
GL_EXT_packed_float
GL_EXT_provoking_vertex
GL_EXT_rescale_normal
GL_EXT_secondary_color
GL_EXT_separate_specular_color
GL_EXT_shadow_funcs
GL_EXT_stencil_two_side
GL_EXT_stencil_wrap
GL_EXT_texture_array
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_s3tc
GL_EXT_texture_env_add
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_integer
GL_EXT_texture_lod_bias
GL_EXT_texture_mirror_clamp
GL_EXT_texture_rectangle
GL_EXT_texture_shared_exponent
GL_EXT_texture_sRGB
GL_EXT_texture_sRGB_decode
GL_EXT_timer_query
GL_EXT_transform_feedback
GL_EXT_vertex_array_bgra
GL_APPLE_aux_depth_stencil
GL_APPLE_client_storage
GL_APPLE_element_array
GL_APPLE_fence
GL_APPLE_float_pixels
GL_APPLE_flush_buffer_range
GL_APPLE_flush_render
GL_APPLE_object_purgeable
GL_APPLE_packed_pixels
GL_APPLE_pixel_buffer
GL_APPLE_rgb_422
GL_APPLE_row_bytes
GL_APPLE_specular_vector
GL_APPLE_texture_range
GL_APPLE_transform_hint
GL_APPLE_vertex_array_object
GL_APPLE_vertex_array_range
GL_APPLE_vertex_point_size
GL_APPLE_vertex_program_evaluators
GL_APPLE_ycbcr_422
GL_ATI_separate_stencil
GL_ATI_texture_env_combine3
GL_ATI_texture_float
GL_ATI_texture_mirror_once
GL_IBM_rasterpos_clip
GL_NV_blend_square
GL_NV_conditional_render
GL_NV_depth_clamp
GL_NV_fog_distance
GL_NV_fragment_program_option
GL_NV_fragment_program2
GL_NV_light_max_exponent
GL_NV_multisample_filter_hint
GL_NV_point_sprite
GL_NV_texgen_reflection
GL_NV_texture_barrier
GL_NV_vertex_program2_option
GL_NV_vertex_program3
GL_SGIS_generate_mipmap
GL_SGIS_texture_edge_clamp
GL_SGIS_texture_lod

@unknownbrackets
Copy link
Contributor

It's probably reasonable to assume any NVIDIA below OpenGL 3 might not handle it properly? Or maybe there's an extension name we ought to be looking at.

-[Unknown]

@hrydgard
Copy link
Owner

This should help: hrydgard/ppsspp@159c8ba

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants