aseprite / aseprite/laf

Window scaling fails with `skia` backend and GPU/opengl acceleration enabled

Open
#166 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
349
Forks
97
Avg merge
4d 7h
Merged PRs (30d)
2

Description

Hello,

- I noticed that the sample https://github.com/aseprite/laf/blob/main/examples/shader.cpp doesn't work properly on my machine in a specific set of circumstances:
- skia backend
- GPU acceleration ON
- window scaling factor > 1

- I have compiled `skia` from https://github.com/aseprite/skia, branch `aseprite-m124`, and I have compiled `laf` with that skia backend.

---

Running the shader example out of the box, I get

Image

which is the expected behavior.

---

If I modify https://github.com/aseprite/laf/blob/main/examples/shader.cpp#L59 to

```cpp
class ShaderWindow {
public:
ShaderWindow(const SystemRef& system)
: m_system(system)
, m_builder(SkRuntimeEffect::MakeForShader(SkString(shaderCode)).effect)
{
m_window = m_system->makeWindow(256, 256, 2); // <-- CHANGE SCALING FACTOR TO 2
m_window->setCursor(NativeCursor::Arrow);
m_window->setTitle("Shader - GPU");
m_window->setGpuAcceleration(true);
repaint();
m_window->setVisible(true);
}
```

Then I get

Image

Which is obviously wrong. The app is still running, the surface is just black.

---

Digging in a little bit, the problem seems to be in [`os::skia::SkiaGL::createRenderTarget(...)`](https://github.com/aseprite/laf/blob/main/os/skia/skia_gl.cpp#L68-L115):

```cpp
bool SkiaGL::createRenderTarget(const gfx::Size& size,
const int scale,
sk_sp colorSpace)
{
// Create of a SkSurface (m_backbufferSurface) connected to the
// OpenGL framebuffer.

GrGLint buffer;
m_glInterfaces->fFunctions.fGetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer);
// PROBLEM IS APPARENTLY HERE ^^^^^^^^^^^^^^^^^^^^^^^^^

GrGLFramebufferInfo info;
info.fFBOID = (GrGLuint)buffer;
info.fFormat = GR_GL_RGBA8;
// SK_API bool GrBackendRenderTargets::GetGLFramebufferInfo(const GrBackendRenderTarget&,
// GrGLFramebufferInfo*);

GrGLint stencil = 0;
m_glInterfaces->fFunctions.fGetIntegerv(GR_GL_STENCIL_BITS, &stencil);

// GrBackendRenderTarget target(size.w, size.h, 0, stencil, info);
GrBackendRenderTarget target = GrBackendRenderTargets::MakeGL(size.w, size.h, 0, stencil, info);

// ...
}
```

The problem is that the call to `fGetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer)` generates `GL_INVALID_ENUM`, which can be seen by checking for errors after that call...

```cpp

// Clear any previous GL errors
while (m_glInterfaces->fFunctions.fGetError() != GR_GL_NO_ERROR) {}

GrGLint buffer;
m_glInterfaces->fFunctions.fGetIntegerv(GR_GL_FRAMEBUFFER_BINDING, &buffer);

GrGLenum error = m_glInterfaces->fFunctions.fGetError();

std::cout << "[SkiaGL::createRenderTarget] Creating render target:" << std::endl;
std::cout << " Size: " << size.w << "x" << size.h << std::endl;
std::cout << " Scale: " << scale << std::endl;
std::cout << " Current FBO binding: " << buffer << std::endl;
if (error != GR_GL_NO_ERROR) {
std::cout << " GL Error after FBO query: " << error << std::endl;
}

```

...which prints

```
[SkiaGL::createRenderTarget] Creating render target:
Size: 256x256
Scale: 2
Current FBO binding: 22005
GL Error after FBO query: 1280 // this is 0x0500, which is GL_INVALID_ENUM
```
---
My knowledge of OpenGL is rudimentary, so take this with a big grain of salt. What I think is going on here is that `GL_FRAMEBUFFER_BINDING` is not a valid parameter to `glGetIntegerv(...)`; it doesn't appear in the extensive list of params for that function in the [OpenGL 4.5 documentation](https://registry.khronos.org/OpenGL-Refpages/gl4/html/glGet.xhtml).

There are two related constants, `GL_DRAW_FRAMEBUFFER_BINDING` and `GL_READ_FRAMEBUFFER_BINDING`, and I infer from some googling that the former is equivalent/backwards compatible with `GL_FRAMEBUFFER_BINDING`. But neither of those params appear in [the `ganesh` defines within skia](https://github.com/aseprite/skia/blob/aseprite-m124/src/gpu/ganesh/gl/GrGLDefines.h) and neither of them work if I just use the literal values in that call; I get the same `GL_INVALID_ENUM` error.

The param does appear in the [OpenGL ES documentation for `glGetIntegerv(...)`](https://registry.khronos.org/OpenGL-Refpages/es2.0/xhtml/glGet.xml). But when I call `glGetVersion(...)` I get back `4.6.0 NVIDIA 560.28.03`, so I believe that means we are using core profile, not OpenGL ES, here.

---

The example works if I catch the error and hardcode the buffer to 0:

```cpp
std::cout << "[SkiaGL::createRenderTarget] Creating render target:" << std::endl;
std::cout << " Size: " << size.w << "x" << size.h << std::endl;
std::cout << " Scale: " << scale << std::endl;
std::cout << " Current FBO binding: " << buffer << std::endl;
if (error != GR_GL_NO_ERROR) {
std::cout << " GL Error after FBO query: " << error << std::endl;
std::cout << " WARNING: Using default framebuffer (0) instead" << std::endl;
buffer = 0; // Use default framebuffer
}
```

Then I can scale as much as I like:

4x:
Image

16x:
Image

But this seems inelegant.

---

In case it helps:

```
$ uname -a
Linux legolas 6.8.0-41-generic #41-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 2 20:41:06 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

$ glxinfo
name of display: :0
display: :0 screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
GLX_ARB_context_flush_control, GLX_ARB_create_context,
GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_multisample, GLX_EXT_buffer_age,
GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_libglvnd,
GLX_EXT_stereo_tree, GLX_EXT_swap_control, GLX_EXT_swap_control_tear,
GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating,
GLX_NV_copy_image, GLX_NV_delay_before_swap, GLX_NV_float_buffer,
GLX_NV_multigpu_context, GLX_NV_robustness_video_memory_purge,
GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGI_swap_control,
GLX_SGI_video_sync
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
GLX_ARB_context_flush_control, GLX_ARB_create_context,
GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_buffer_age,
GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB,
GLX_EXT_import_context, GLX_EXT_stereo_tree, GLX_EXT_swap_control,
GLX_EXT_swap_control_tear, GLX_EXT_texture_from_pixmap,
GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_NV_copy_buffer,
GLX_NV_copy_image, GLX_NV_delay_before_swap, GLX_NV_float_buffer,
GLX_NV_multigpu_context, GLX_NV_multisample_coverage,
GLX_NV_robustness_video_memory_purge, GLX_NV_swap_group,
GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGI_swap_control,
GLX_SGI_video_sync
GLX version: 1.4
GLX extensions:
GLX_ARB_context_flush_control, GLX_ARB_create_context,
GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_buffer_age,
GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_stereo_tree,
GLX_EXT_swap_control, GLX_EXT_swap_control_tear,
GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating,
GLX_NV_copy_image, GLX_NV_delay_before_swap, GLX_NV_float_buffer,
GLX_NV_multigpu_context, GLX_NV_robustness_video_memory_purge,
GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGI_swap_control,
GLX_SGI_video_sync
Memory info (GL_NVX_gpu_memory_info):
Dedicated video memory: 12288 MB
Total available memory: 12288 MB
Currently available dedicated video memory: 9700 MB
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce RTX 3080 Ti/PCIe/SSE2
OpenGL core profile version string: 4.6.0 NVIDIA 560.28.03
OpenGL core profile shading language version string: 4.60 NVIDIA
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
GL_AMD_multi_draw_indirect, GL_AMD_seamless_cubemap_per_texture,
GL_AMD_vertex_shader_layer, GL_AMD_vertex_shader_viewport_index,
GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility,
GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility,
GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_bindless_texture,
GL_ARB_blend_func_extended, GL_ARB_buffer_storage,
GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control,
GL_ARB_color_buffer_float, GL_ARB_compressed_texture_pixel_storage,
GL_ARB_compute_shader, GL_ARB_compute_variable_group_size,
GL_ARB_conditional_render_inverted, GL_ARB_conservative_depth,
GL_ARB_copy_buffer, GL_ARB_copy_image, GL_ARB_cull_distance,
GL_ARB_debug_output, GL_ARB_depth_buffer_float, GL_ARB_depth_clamp,
GL_ARB_depth_texture, GL_ARB_derivative_control,
GL_ARB_direct_state_access, GL_ARB_draw_buffers,
GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex,
GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts,
GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location,
GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport,
GL_ARB_fragment_program, GL_ARB_fragment_program_shadow,
GL_ARB_fragment_shader, GL_ARB_fragment_shader_interlock,
GL_ARB_framebuffer_no_attachments, GL_ARB_framebuffer_object,
GL_ARB_framebuffer_sRGB, GL_ARB_geometry_shader4,
GL_ARB_get_program_binary, GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv,
GL_ARB_gpu_shader5, GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64,
GL_ARB_half_float_pixel, GL_ARB_half_float_vertex, GL_ARB_imaging,
GL_ARB_indirect_parameters, GL_ARB_instanced_arrays,
GL_ARB_internalformat_query, GL_ARB_internalformat_query2,
GL_ARB_invalidate_subdata, GL_ARB_map_buffer_alignment,
GL_ARB_map_buffer_range, GL_ARB_multi_bind, GL_ARB_multi_draw_indirect,
GL_ARB_multisample, GL_ARB_multitexture, GL_ARB_occlusion_query,
GL_ARB_occlusion_query2, GL_ARB_parallel_shader_compile,
GL_ARB_pipeline_statistics_query, GL_ARB_pixel_buffer_object,
GL_ARB_point_parameters, GL_ARB_point_sprite, GL_ARB_polygon_offset_clamp,
GL_ARB_post_depth_coverage, GL_ARB_program_interface_query,
GL_ARB_provoking_vertex, GL_ARB_query_buffer_object,
GL_ARB_robust_buffer_access_behavior, GL_ARB_robustness,
GL_ARB_sample_locations, GL_ARB_sample_shading, GL_ARB_sampler_objects,
GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture,
GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops,
GL_ARB_shader_atomic_counters, GL_ARB_shader_ballot,
GL_ARB_shader_bit_encoding, GL_ARB_shader_clock,
GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote,
GL_ARB_shader_image_load_store, GL_ARB_shader_image_size,
GL_ARB_shader_objects, GL_ARB_shader_precision,
GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine,
GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod,
GL_ARB_shader_viewport_layer_array, GL_ARB_shading_language_100,
GL_ARB_shading_language_420pack, GL_ARB_shading_language_include,
GL_ARB_shading_language_packing, GL_ARB_shadow, GL_ARB_sparse_buffer,
GL_ARB_sparse_texture, GL_ARB_sparse_texture2,
GL_ARB_sparse_texture_clamp, GL_ARB_spirv_extensions,
GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader,
GL_ARB_texture_barrier, GL_ARB_texture_border_clamp,
GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32,
GL_ARB_texture_buffer_range, GL_ARB_texture_compression,
GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc,
GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array,
GL_ARB_texture_env_add, GL_ARB_texture_env_combine,
GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3,
GL_ARB_texture_filter_anisotropic, GL_ARB_texture_filter_minmax,
GL_ARB_texture_float, GL_ARB_texture_gather,
GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat,
GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two,
GL_ARB_texture_query_levels, GL_ARB_texture_query_lod,
GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui,
GL_ARB_texture_stencil8, GL_ARB_texture_storage,
GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle,
GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2,
GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced,
GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix,
GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra,
GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit,
GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object,
GL_ARB_vertex_program, GL_ARB_vertex_shader,
GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev,
GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_draw_buffers,
GL_ATI_texture_float, GL_ATI_texture_mirror_once,
GL_EXTX_framebuffer_mixed_formats, GL_EXT_Cg_shader, 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_compiled_vertex_array,
GL_EXT_depth_bounds_test, GL_EXT_direct_state_access,
GL_EXT_draw_buffers2, GL_EXT_draw_instanced, 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_import_sync_object, GL_EXT_memory_object, GL_EXT_memory_object_fd,
GL_EXT_multi_draw_arrays, GL_EXT_multiview_texture_multisample,
GL_EXT_multiview_timer_query, GL_EXT_packed_depth_stencil,
GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object,
GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp,
GL_EXT_post_depth_coverage, GL_EXT_provoking_vertex,
GL_EXT_raster_multisample, GL_EXT_rescale_normal, GL_EXT_secondary_color,
GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects,
GL_EXT_separate_specular_color, GL_EXT_shader_image_load_formatted,
GL_EXT_shader_image_load_store, GL_EXT_shader_integer_mix,
GL_EXT_shadow_funcs, GL_EXT_sparse_texture2, GL_EXT_stencil_two_side,
GL_EXT_stencil_wrap, GL_EXT_texture3D, GL_EXT_texture_array,
GL_EXT_texture_buffer_object, GL_EXT_texture_compression_dxt1,
GL_EXT_texture_compression_latc, GL_EXT_texture_compression_rgtc,
GL_EXT_texture_compression_s3tc, GL_EXT_texture_cube_map,
GL_EXT_texture_edge_clamp, GL_EXT_texture_env_add,
GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,
GL_EXT_texture_filter_anisotropic, GL_EXT_texture_filter_minmax,
GL_EXT_texture_integer, GL_EXT_texture_lod, GL_EXT_texture_lod_bias,
GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_sRGB,
GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_decode,
GL_EXT_texture_shadow_lod, GL_EXT_texture_shared_exponent,
GL_EXT_texture_storage, GL_EXT_texture_swizzle, GL_EXT_timer_query,
GL_EXT_transform_feedback2, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra,
GL_EXT_vertex_attrib_64bit, GL_EXT_window_rectangles,
GL_EXT_x11_sync_object, GL_IBM_rasterpos_clip,
GL_IBM_texture_mirrored_repeat, GL_KHR_blend_equation_advanced,
GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control,
GL_KHR_debug, GL_KHR_no_error, GL_KHR_parallel_shader_compile,
GL_KHR_robust_buffer_access_behavior, GL_KHR_robustness,
GL_KHR_shader_subgroup, GL_KTX_buffer_region,
GL_NVX_blend_equation_advanced_multi_draw_buffers,
GL_NVX_conditional_render, GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop,
GL_NVX_progress_fence, GL_NV_ES1_1_compatibility,
GL_NV_ES3_1_compatibility, GL_NV_alpha_to_coverage_dither_control,
GL_NV_bindless_multi_draw_indirect,
GL_NV_bindless_multi_draw_indirect_count, GL_NV_bindless_texture,
GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent,
GL_NV_blend_minmax_factor, GL_NV_blend_square, GL_NV_clip_space_w_scaling,
GL_NV_command_list, GL_NV_compute_program5,
GL_NV_compute_shader_derivatives, GL_NV_conditional_render,
GL_NV_conservative_raster, GL_NV_conservative_raster_dilate,
GL_NV_conservative_raster_pre_snap,
GL_NV_conservative_raster_pre_snap_triangles,
GL_NV_conservative_raster_underestimation, GL_NV_copy_depth_to_color,
GL_NV_copy_image, GL_NV_depth_buffer_float, GL_NV_depth_clamp,
GL_NV_draw_texture, GL_NV_draw_vulkan_image, GL_NV_explicit_multisample,
GL_NV_feature_query, GL_NV_fence, GL_NV_fill_rectangle,
GL_NV_float_buffer, GL_NV_fog_distance, GL_NV_fragment_coverage_to_color,
GL_NV_fragment_program, GL_NV_fragment_program2,
GL_NV_fragment_program_option, GL_NV_fragment_shader_barycentric,
GL_NV_fragment_shader_interlock, GL_NV_framebuffer_mixed_samples,
GL_NV_framebuffer_multisample_coverage, GL_NV_geometry_shader4,
GL_NV_geometry_shader_passthrough, GL_NV_gpu_multicast,
GL_NV_gpu_program4, GL_NV_gpu_program4_1, GL_NV_gpu_program5,
GL_NV_gpu_program5_mem_extended, GL_NV_gpu_program_fp64,
GL_NV_gpu_program_multiview, GL_NV_gpu_shader5, GL_NV_half_float,
GL_NV_internalformat_sample_query, GL_NV_light_max_exponent,
GL_NV_memory_attachment, GL_NV_memory_object_sparse, GL_NV_mesh_shader,
GL_NV_multisample_coverage, GL_NV_multisample_filter_hint,
GL_NV_occlusion_query, GL_NV_packed_depth_stencil,
GL_NV_parameter_buffer_object, GL_NV_parameter_buffer_object2,
GL_NV_path_rendering, GL_NV_path_rendering_shared_edge,
GL_NV_pixel_data_range, GL_NV_point_sprite, GL_NV_primitive_restart,
GL_NV_primitive_shading_rate, GL_NV_query_resource,
GL_NV_query_resource_tag, GL_NV_register_combiners,
GL_NV_register_combiners2, GL_NV_representative_fragment_test,
GL_NV_robustness_video_memory_purge, GL_NV_sample_locations,
GL_NV_sample_mask_override_coverage, GL_NV_scissor_exclusive,
GL_NV_shader_atomic_counters, GL_NV_shader_atomic_float,
GL_NV_shader_atomic_float64, GL_NV_shader_atomic_fp16_vector,
GL_NV_shader_atomic_int64, GL_NV_shader_buffer_load,
GL_NV_shader_storage_buffer_object, GL_NV_shader_subgroup_partitioned,
GL_NV_shader_texture_footprint, GL_NV_shader_thread_group,
GL_NV_shader_thread_shuffle, GL_NV_shading_rate_image,
GL_NV_stereo_view_rendering, GL_NV_texgen_reflection,
GL_NV_texture_barrier, GL_NV_texture_compression_vtc,
GL_NV_texture_dirty_tile_map, GL_NV_texture_env_combine4,
GL_NV_texture_multisample, GL_NV_texture_rectangle,
GL_NV_texture_rectangle_compressed, GL_NV_texture_shader,
GL_NV_texture_shader2, GL_NV_texture_shader3, GL_NV_timeline_semaphore,
GL_NV_transform_feedback, GL_NV_transform_feedback2,
GL_NV_uniform_buffer_std430_layout, GL_NV_uniform_buffer_unified_memory,
GL_NV_vdpau_interop, GL_NV_vdpau_interop2, GL_NV_vertex_array_range,
GL_NV_vertex_array_range2, GL_NV_vertex_attrib_integer_64bit,
GL_NV_vertex_buffer_unified_memory, GL_NV_vertex_program,
GL_NV_vertex_program1_1, GL_NV_vertex_program2,
GL_NV_vertex_program2_option, GL_NV_vertex_program3,
GL_NV_viewport_array2, GL_NV_viewport_swizzle, GL_OVR_multiview,
GL_OVR_multiview2, GL_S3_s3tc, GL_SGIS_generate_mipmap,
GL_SGIS_texture_lod, GL_SGIX_depth_texture, GL_SGIX_shadow,
GL_SUN_slice_accum

OpenGL version string: 4.6.0 NVIDIA 560.28.03
OpenGL shading language version string: 4.60 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
GL_AMD_multi_draw_indirect, GL_AMD_seamless_cubemap_per_texture,
GL_AMD_vertex_shader_layer, GL_AMD_vertex_shader_viewport_index,
GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility,
GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility,
GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_bindless_texture,
GL_ARB_blend_func_extended, GL_ARB_buffer_storage,
GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control,
GL_ARB_color_buffer_float, GL_ARB_compatibility,
GL_ARB_compressed_texture_pixel_storage, GL_ARB_compute_shader,
GL_ARB_compute_variable_group_size, GL_ARB_conditional_render_inverted,
GL_ARB_conservative_depth, GL_ARB_copy_buffer, GL_ARB_copy_image,
GL_ARB_cull_distance, GL_ARB_debug_output, GL_ARB_depth_buffer_float,
GL_ARB_depth_clamp, GL_ARB_depth_texture, GL_ARB_derivative_control,
GL_ARB_direct_state_access, GL_ARB_draw_buffers,
GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex,
GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts,
GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location,
GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport,
GL_ARB_fragment_program, GL_ARB_fragment_program_shadow,
GL_ARB_fragment_shader, GL_ARB_fragment_shader_interlock,
GL_ARB_framebuffer_no_attachments, GL_ARB_framebuffer_object,
GL_ARB_framebuffer_sRGB, GL_ARB_geometry_shader4,
GL_ARB_get_program_binary, GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv,
GL_ARB_gpu_shader5, GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64,
GL_ARB_half_float_pixel, GL_ARB_half_float_vertex, GL_ARB_imaging,
GL_ARB_indirect_parameters, GL_ARB_instanced_arrays,
GL_ARB_internalformat_query, GL_ARB_internalformat_query2,
GL_ARB_invalidate_subdata, GL_ARB_map_buffer_alignment,
GL_ARB_map_buffer_range, GL_ARB_multi_bind, GL_ARB_multi_draw_indirect,
GL_ARB_multisample, GL_ARB_multitexture, GL_ARB_occlusion_query,
GL_ARB_occlusion_query2, GL_ARB_parallel_shader_compile,
GL_ARB_pipeline_statistics_query, GL_ARB_pixel_buffer_object,
GL_ARB_point_parameters, GL_ARB_point_sprite, GL_ARB_polygon_offset_clamp,
GL_ARB_post_depth_coverage, GL_ARB_program_interface_query,
GL_ARB_provoking_vertex, GL_ARB_query_buffer_object,
GL_ARB_robust_buffer_access_behavior, GL_ARB_robustness,
GL_ARB_sample_locations, GL_ARB_sample_shading, GL_ARB_sampler_objects,
GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture,
GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops,
GL_ARB_shader_atomic_counters, GL_ARB_shader_ballot,
GL_ARB_shader_bit_encoding, GL_ARB_shader_clock,
GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote,
GL_ARB_shader_image_load_store, GL_ARB_shader_image_size,
GL_ARB_shader_objects, GL_ARB_shader_precision,
GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine,
GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod,
GL_ARB_shader_viewport_layer_array, GL_ARB_shading_language_100,
GL_ARB_shading_language_420pack, GL_ARB_shading_language_include,
GL_ARB_shading_language_packing, GL_ARB_shadow, GL_ARB_sparse_buffer,
GL_ARB_sparse_texture, GL_ARB_sparse_texture2,
GL_ARB_sparse_texture_clamp, GL_ARB_spirv_extensions,
GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader,
GL_ARB_texture_barrier, GL_ARB_texture_border_clamp,
GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32,
GL_ARB_texture_buffer_range, GL_ARB_texture_compression,
GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc,
GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array,
GL_ARB_texture_env_add, GL_ARB_texture_env_combine,
GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3,
GL_ARB_texture_filter_anisotropic, GL_ARB_texture_filter_minmax,
GL_ARB_texture_float, GL_ARB_texture_gather,
GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat,
GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two,
GL_ARB_texture_query_levels, GL_ARB_texture_query_lod,
GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui,
GL_ARB_texture_stencil8, GL_ARB_texture_storage,
GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle,
GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2,
GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced,
GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix,
GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra,
GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit,
GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object,
GL_ARB_vertex_program, GL_ARB_vertex_shader,
GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev,
GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_draw_buffers,
GL_ATI_texture_float, GL_ATI_texture_mirror_once,
GL_EXTX_framebuffer_mixed_formats, GL_EXT_Cg_shader, 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_compiled_vertex_array,
GL_EXT_depth_bounds_test, GL_EXT_direct_state_access,
GL_EXT_draw_buffers2, GL_EXT_draw_instanced, 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_import_sync_object, GL_EXT_memory_object, GL_EXT_memory_object_fd,
GL_EXT_multi_draw_arrays, GL_EXT_multiview_texture_multisample,
GL_EXT_multiview_timer_query, GL_EXT_packed_depth_stencil,
GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object,
GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp,
GL_EXT_post_depth_coverage, GL_EXT_provoking_vertex,
GL_EXT_raster_multisample, GL_EXT_rescale_normal, GL_EXT_secondary_color,
GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects,
GL_EXT_separate_specular_color, GL_EXT_shader_image_load_formatted,
GL_EXT_shader_image_load_store, GL_EXT_shader_integer_mix,
GL_EXT_shadow_funcs, GL_EXT_sparse_texture2, GL_EXT_stencil_two_side,
GL_EXT_stencil_wrap, GL_EXT_texture3D, GL_EXT_texture_array,
GL_EXT_texture_buffer_object, GL_EXT_texture_compression_dxt1,
GL_EXT_texture_compression_latc, GL_EXT_texture_compression_rgtc,
GL_EXT_texture_compression_s3tc, GL_EXT_texture_cube_map,
GL_EXT_texture_edge_clamp, GL_EXT_texture_env_add,
GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,
GL_EXT_texture_filter_anisotropic, GL_EXT_texture_filter_minmax,
GL_EXT_texture_integer, GL_EXT_texture_lod, GL_EXT_texture_lod_bias,
GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_sRGB,
GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_decode,
GL_EXT_texture_shadow_lod, GL_EXT_texture_shared_exponent,
GL_EXT_texture_storage, GL_EXT_texture_swizzle, GL_EXT_timer_query,
GL_EXT_transform_feedback2, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra,
GL_EXT_vertex_attrib_64bit, GL_EXT_window_rectangles,
GL_EXT_x11_sync_object, GL_IBM_rasterpos_clip,
GL_IBM_texture_mirrored_repeat, GL_KHR_blend_equation_advanced,
GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control,
GL_KHR_debug, GL_KHR_no_error, GL_KHR_parallel_shader_compile,
GL_KHR_robust_buffer_access_behavior, GL_KHR_robustness,
GL_KHR_shader_subgroup, GL_KTX_buffer_region,
GL_NVX_blend_equation_advanced_multi_draw_buffers,
GL_NVX_conditional_render, GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop,
GL_NVX_progress_fence, GL_NV_ES1_1_compatibility,
GL_NV_ES3_1_compatibility, GL_NV_alpha_to_coverage_dither_control,
GL_NV_bindless_multi_draw_indirect,
GL_NV_bindless_multi_draw_indirect_count, GL_NV_bindless_texture,
GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent,
GL_NV_blend_minmax_factor, GL_NV_blend_square, GL_NV_clip_space_w_scaling,
GL_NV_command_list, GL_NV_compute_program5,
GL_NV_compute_shader_derivatives, GL_NV_conditional_render,
GL_NV_conservative_raster, GL_NV_conservative_raster_dilate,
GL_NV_conservative_raster_pre_snap,
GL_NV_conservative_raster_pre_snap_triangles,
GL_NV_conservative_raster_underestimation, GL_NV_copy_depth_to_color,
GL_NV_copy_image, GL_NV_depth_buffer_float, GL_NV_depth_clamp,
GL_NV_draw_texture, GL_NV_draw_vulkan_image, GL_NV_explicit_multisample,
GL_NV_feature_query, GL_NV_fence, GL_NV_fill_rectangle,
GL_NV_float_buffer, GL_NV_fog_distance, GL_NV_fragment_coverage_to_color,
GL_NV_fragment_program, GL_NV_fragment_program2,
GL_NV_fragment_program_option, GL_NV_fragment_shader_barycentric,
GL_NV_fragment_shader_interlock, GL_NV_framebuffer_mixed_samples,
GL_NV_framebuffer_multisample_coverage, GL_NV_geometry_shader4,
GL_NV_geometry_shader_passthrough, GL_NV_gpu_multicast,
GL_NV_gpu_program4, GL_NV_gpu_program4_1, GL_NV_gpu_program5,
GL_NV_gpu_program5_mem_extended, GL_NV_gpu_program_fp64,
GL_NV_gpu_program_multiview, GL_NV_gpu_shader5, GL_NV_half_float,
GL_NV_internalformat_sample_query, GL_NV_light_max_exponent,
GL_NV_memory_attachment, GL_NV_memory_object_sparse, GL_NV_mesh_shader,
GL_NV_multisample_coverage, GL_NV_multisample_filter_hint,
GL_NV_occlusion_query, GL_NV_packed_depth_stencil,
GL_NV_parameter_buffer_object, GL_NV_parameter_buffer_object2,
GL_NV_path_rendering, GL_NV_path_rendering_shared_edge,
GL_NV_pixel_data_range, GL_NV_point_sprite, GL_NV_primitive_restart,
GL_NV_primitive_shading_rate, GL_NV_query_resource,
GL_NV_query_resource_tag, GL_NV_register_combiners,
GL_NV_register_combiners2, GL_NV_representative_fragment_test,
GL_NV_robustness_video_memory_purge, GL_NV_sample_locations,
GL_NV_sample_mask_override_coverage, GL_NV_scissor_exclusive,
GL_NV_shader_atomic_counters, GL_NV_shader_atomic_float,
GL_NV_shader_atomic_float64, GL_NV_shader_atomic_fp16_vector,
GL_NV_shader_atomic_int64, GL_NV_shader_buffer_load,
GL_NV_shader_storage_buffer_object, GL_NV_shader_subgroup_partitioned,
GL_NV_shader_texture_footprint, GL_NV_shader_thread_group,
GL_NV_shader_thread_shuffle, GL_NV_shading_rate_image,
GL_NV_stereo_view_rendering, GL_NV_texgen_reflection,
GL_NV_texture_barrier, GL_NV_texture_compression_vtc,
GL_NV_texture_dirty_tile_map, GL_NV_texture_env_combine4,
GL_NV_texture_multisample, GL_NV_texture_rectangle,
GL_NV_texture_rectangle_compressed, GL_NV_texture_shader,
GL_NV_texture_shader2, GL_NV_texture_shader3, GL_NV_timeline_semaphore,
GL_NV_transform_feedback, GL_NV_transform_feedback2,
GL_NV_uniform_buffer_std430_layout, GL_NV_uniform_buffer_unified_memory,
GL_NV_vdpau_interop, GL_NV_vdpau_interop2, GL_NV_vertex_array_range,
GL_NV_vertex_array_range2, GL_NV_vertex_attrib_integer_64bit,
GL_NV_vertex_buffer_unified_memory, GL_NV_vertex_program,
GL_NV_vertex_program1_1, GL_NV_vertex_program2,
GL_NV_vertex_program2_option, GL_NV_vertex_program3,
GL_NV_viewport_array2, GL_NV_viewport_swizzle, GL_OVR_multiview,
GL_OVR_multiview2, GL_S3_s3tc, GL_SGIS_generate_mipmap,
GL_SGIS_texture_lod, GL_SGIX_depth_texture, GL_SGIX_shadow,
GL_SUN_slice_accum

OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 560.28.03
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:
GL_ANDROID_extension_pack_es31a, GL_EXT_EGL_image_external_wrap_modes,
GL_EXT_base_instance, GL_EXT_blend_func_extended, GL_EXT_blend_minmax,
GL_EXT_buffer_storage, GL_EXT_clear_texture, GL_EXT_clip_control,
GL_EXT_clip_cull_distance, GL_EXT_color_buffer_float,
GL_EXT_color_buffer_half_float, GL_EXT_compressed_ETC1_RGB8_sub_texture,
GL_EXT_conservative_depth, GL_EXT_copy_image, GL_EXT_debug_label,
GL_EXT_depth_clamp, GL_EXT_discard_framebuffer,
GL_EXT_disjoint_timer_query, GL_EXT_draw_buffers_indexed,
GL_EXT_draw_elements_base_vertex, GL_EXT_draw_transform_feedback,
GL_EXT_float_blend, GL_EXT_frag_depth, GL_EXT_geometry_point_size,
GL_EXT_geometry_shader, GL_EXT_gpu_shader5, GL_EXT_map_buffer_range,
GL_EXT_memory_object, GL_EXT_memory_object_fd, GL_EXT_multi_draw_indirect,
GL_EXT_multisample_compatibility, GL_EXT_multisampled_render_to_texture,
GL_EXT_multisampled_render_to_texture2,
GL_EXT_multiview_texture_multisample, GL_EXT_multiview_timer_query,
GL_EXT_occlusion_query_boolean, GL_EXT_polygon_offset_clamp,
GL_EXT_post_depth_coverage, GL_EXT_primitive_bounding_box,
GL_EXT_raster_multisample, GL_EXT_read_format_bgra, GL_EXT_render_snorm,
GL_EXT_robustness, GL_EXT_sRGB, GL_EXT_sRGB_write_control,
GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects,
GL_EXT_shader_group_vote, GL_EXT_shader_implicit_conversions,
GL_EXT_shader_integer_mix, GL_EXT_shader_io_blocks,
GL_EXT_shader_non_constant_global_initializers, GL_EXT_shader_texture_lod,
GL_EXT_shadow_samplers, GL_EXT_sparse_texture, GL_EXT_sparse_texture2,
GL_EXT_tessellation_point_size, GL_EXT_tessellation_shader,
GL_EXT_texture_border_clamp, GL_EXT_texture_buffer,
GL_EXT_texture_compression_bptc, GL_EXT_texture_compression_dxt1,
GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc,
GL_EXT_texture_cube_map_array, GL_EXT_texture_filter_anisotropic,
GL_EXT_texture_filter_minmax, GL_EXT_texture_format_BGRA8888,
GL_EXT_texture_mirror_clamp_to_edge, GL_EXT_texture_norm16,
GL_EXT_texture_query_lod, GL_EXT_texture_rg, GL_EXT_texture_sRGB_R8,
GL_EXT_texture_sRGB_decode, GL_EXT_texture_shadow_lod,
GL_EXT_texture_storage, GL_EXT_texture_view, GL_EXT_unpack_subimage,
GL_EXT_window_rectangles, GL_KHR_blend_equation_advanced,
GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control,
GL_KHR_debug, GL_KHR_no_error, GL_KHR_parallel_shader_compile,
GL_KHR_robust_buffer_access_behavior, GL_KHR_robustness,
GL_KHR_shader_subgroup, GL_KHR_texture_compression_astc_hdr,
GL_KHR_texture_compression_astc_ldr,
GL_KHR_texture_compression_astc_sliced_3d,
GL_NVX_blend_equation_advanced_multi_draw_buffers, GL_NV_bgr,
GL_NV_bindless_texture, GL_NV_blend_equation_advanced,
GL_NV_blend_equation_advanced_coherent, GL_NV_blend_minmax_factor,
GL_NV_clip_space_w_scaling, GL_NV_compute_shader_derivatives,
GL_NV_conditional_render, GL_NV_conservative_raster,
GL_NV_conservative_raster_pre_snap_triangles, GL_NV_copy_buffer,
GL_NV_copy_image, GL_NV_draw_buffers, GL_NV_draw_instanced,
GL_NV_draw_texture, GL_NV_draw_vulkan_image,
GL_NV_explicit_attrib_location, GL_NV_fbo_color_attachments,
GL_NV_fill_rectangle, GL_NV_fragment_coverage_to_color,
GL_NV_fragment_shader_barycentric, GL_NV_fragment_shader_interlock,
GL_NV_framebuffer_blit, GL_NV_framebuffer_mixed_samples,
GL_NV_framebuffer_multisample, GL_NV_generate_mipmap_sRGB,
GL_NV_geometry_shader_passthrough, GL_NV_gpu_shader5, GL_NV_image_formats,
GL_NV_instanced_arrays, GL_NV_internalformat_sample_query,
GL_NV_memory_attachment, GL_NV_memory_object_sparse, GL_NV_mesh_shader,
GL_NV_non_square_matrices, GL_NV_occlusion_query_samples,
GL_NV_pack_subimage, GL_NV_packed_float, GL_NV_packed_float_linear,
GL_NV_path_rendering, GL_NV_path_rendering_shared_edge,
GL_NV_pixel_buffer_object, GL_NV_polygon_mode,
GL_NV_primitive_shading_rate, GL_NV_read_buffer, GL_NV_read_depth,
GL_NV_read_depth_stencil, GL_NV_read_stencil,
GL_NV_representative_fragment_test, GL_NV_sRGB_formats,
GL_NV_sample_locations, GL_NV_sample_mask_override_coverage,
GL_NV_scissor_exclusive, GL_NV_shader_atomic_fp16_vector,
GL_NV_shader_noperspective_interpolation,
GL_NV_shader_subgroup_partitioned, GL_NV_shader_texture_footprint,
GL_NV_shading_rate_image, GL_NV_shadow_samplers_array,
GL_NV_shadow_samplers_cube, GL_NV_stereo_view_rendering,
GL_NV_texture_array, GL_NV_texture_barrier, GL_NV_texture_border_clamp,
GL_NV_texture_compression_latc, GL_NV_texture_compression_s3tc,
GL_NV_texture_compression_s3tc_update, GL_NV_texture_dirty_tile_map,
GL_NV_timeline_semaphore, GL_NV_timer_query, GL_NV_viewport_array,
GL_NV_viewport_array2, GL_NV_viewport_swizzle,
GL_OES_compressed_ETC1_RGB8_texture, GL_OES_copy_image, GL_OES_depth24,
GL_OES_depth32, GL_OES_depth_texture, GL_OES_depth_texture_cube_map,
GL_OES_draw_buffers_indexed, GL_OES_draw_elements_base_vertex,
GL_OES_element_index_uint, GL_OES_fbo_render_mipmap,
GL_OES_geometry_point_size, GL_OES_geometry_shader,
GL_OES_get_program_binary, GL_OES_gpu_shader5, GL_OES_mapbuffer,
GL_OES_packed_depth_stencil, GL_OES_primitive_bounding_box,
GL_OES_rgb8_rgba8, GL_OES_sample_shading, GL_OES_sample_variables,
GL_OES_shader_image_atomic, GL_OES_shader_io_blocks,
GL_OES_shader_multisample_interpolation, GL_OES_standard_derivatives,
GL_OES_tessellation_point_size, GL_OES_tessellation_shader,
GL_OES_texture_border_clamp, GL_OES_texture_buffer,
GL_OES_texture_cube_map_array, GL_OES_texture_float,
GL_OES_texture_float_linear, GL_OES_texture_half_float,
GL_OES_texture_half_float_linear, GL_OES_texture_npot,
GL_OES_texture_stencil8, GL_OES_texture_storage_multisample_2d_array,
GL_OES_texture_view, GL_OES_vertex_array_object, GL_OES_vertex_half_float,
GL_OES_viewport_array, GL_OVR_multiview, GL_OVR_multiview2,
GL_OVR_multiview_multisampled_render_to_texture

< snipped>
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the issue with examples/shader.cpp using the skia backend, GPU acceleration, and a scale factor above 1. Then inspect os/skia/skia_gl.cpp, especially SkiaGL::createRenderTarget(...), and trace the framebuffer query and render-target setup. Done means the shader example renders correctly at scaled window factors without introducing OpenGL errors.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
computer-graphics, desktop
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.