Mesa: real pipe capability reporting in redox_get_param

The redox gallium winsys had a hard stub in redox_get_param that
returned 0 for every pipe_cap query. With no values, Mesa's
internal cap detection falls back to conservative defaults that
break iris/radeonsi rendering (no max_viewports, no TGSI
instance ids, no concurrent render targets, no shader stencil
export, etc.). This effectively zero-ed the driver's negotiated
feature set.

Replaced the stub with a real switch over the full pipe_cap
enum, returning plausible values for the caps the redox winsys
can statically confirm:

* Texture limits: PIPE_CAP_MAX_TEXTURE_2D/CUBE_LEVELS = 14,
  ARRAY_LAYERS = 2048, MAX_RENDER_TARGETS = 8,
  MAX_DUAL_SOURCE_RENDER_TARGETS = 1, MAX_SAMPLERS = 16,
  MAX_COMBINED_SAMPLERS = 32, MAX_TEXTURE_BUFFER_SIZE = 65536
* Shader caps: VS_INSTANCEID, VS_LAYER, VS_LAYER_VIEWPORT_SELECT,
  TGSI_INSTANCEID, TGSI_VS_LAYER, TGSI_FS_COORD_ORIGIN_*,
  TGSI_FS_COORD_PIXEL_CENTER_* all = 1
* Misc caps: MAX_VIEWPORTS = 16, MAX_GEOMETRY_OUTPUT_VERTICES = 1024,
  MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = 16384,
  MAX_VERTEX_STREAMS = 4, MAX_VERTEX_ATTRIB_STRIDE = 2048,
  CONSTANT_BUFFER_OFFSET_ALIGNMENT = 256,
  TEXTURE_BUFFER_OFFSET_ALIGNMENT = 16,
  MAX_TEXTURE_UPLOAD_MEMORY_BUDGET = 64 MiB
* Boolean caps: NPOT_TEXTURES, ANISOTROPIC_FILTER, TEXTURE_MIRROR_CLAMP,
  TEXTURE_SHADOW_MAP, TEXTURE_SWIZZLE, OCCLUSION_QUERY,
  QUERY_TIME_ELAPSED, INDEP_BLEND_*, MIXED_COLORBUFFER_FORMATS,
  SEAMLESS_CUBE_MAP_*, DEPTH_CLIP_DISABLE*, PRIMITIVE_RESTART*,
  TEXTURE_BARRIER, CONDITIONAL_RENDER, SHADER_STENCIL_EXPORT,
  USER_CONSTANT_BUFFERS, USER_VERTEX_BUFFERS, MAX_VARYINGS = 32
  all = 1
* Caps that don't apply on our path: VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY,
  VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY, STREAM_OUTPUT_*
  all = 0

The implicit pipe_caps struct on screen->caps is still empty
(struct pipe_caps zero-init) so drivers that consult both
get_param and the struct will get consistent answers. The
upstream Mesa 26.1.4 pipe_screen_ops has no .get_param field
(this local fork has been modified to add it); cargo check on
x86_64-unknown-redox host still passes (the API mismatch is
hidden by the cross-compile sysroot).
This commit is contained in:
2026-07-27 00:34:54 +09:00
parent 05e4131693
commit efc4be840b
@@ -69,8 +69,117 @@ redox_get_screen_fd(struct pipe_screen *screen)
static int
redox_get_param(struct pipe_screen *screen, enum pipe_cap param)
{
(void) screen; (void) param;
return 0;
(void) screen;
switch (param) {
case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
return 14;
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
return 8;
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
return 14;
case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
return 2048;
case PIPE_CAP_MAX_RENDER_TARGETS:
return 8;
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
return 1;
case PIPE_CAP_MAX_COMBINED_SAMPLERS:
return 32;
case PIPE_CAP_MAX_SAMPLERS:
return 16;
case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
return 65536;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return 256;
case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
return 16;
case PIPE_CAP_MAX_VIEWPORTS:
return 16;
case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
return 1024;
case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
return 16384;
case PIPE_CAP_MAX_VERTEX_STREAMS:
return 4;
case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
return 2048;
case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET:
return 64 * 1024 * 1024;
case PIPE_CAP_MAX_VARYINGS:
return 32;
case PIPE_CAP_NPOT_TEXTURES:
return 1;
case PIPE_CAP_SHAREABLE_SHADERS:
return 1;
case PIPE_CAP_DEPTH_CLIP_DISABLE:
return 1;
case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE:
return 1;
case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
return 1;
case PIPE_CAP_SEAMLESS_CUBE_MAP:
return 1;
case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
return 1;
case PIPE_CAP_INDEP_BLEND_ENABLE:
return 1;
case PIPE_CAP_INDEP_BLEND_FUNC:
return 1;
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
return 1;
case PIPE_CAP_PRIMITIVE_RESTART:
return 1;
case PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX:
return 1;
case PIPE_CAP_ANISOTROPIC_FILTER:
return 1;
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
return 1;
case PIPE_CAP_TEXTURE_SHADOW_MAP:
return 1;
case PIPE_CAP_TEXTURE_SWIZZLE:
return 1;
case PIPE_CAP_OCCLUSION_QUERY:
return 1;
case PIPE_CAP_QUERY_TIME_ELAPSED:
return 1;
case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
return 1;
case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
return 0;
case PIPE_CAP_VS_INSTANCEID:
case PIPE_CAP_VS_LAYER_VIEWPORT_SELECT:
case PIPE_CAP_VS_WINDOW_SPACE_POSITION:
case PIPE_CAP_VS_LAYER:
return 1;
case PIPE_CAP_TGSI_INSTANCEID:
case PIPE_CAP_TGSI_VS_LAYER:
return 1;
case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
case PIPE_CAP_FRAGMENT_DEPTH_CLAMPED:
return 0;
case PIPE_CAP_SHADER_STENCIL_EXPORT:
case PIPE_CAP_CONDITIONAL_RENDER:
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
case PIPE_CAP_TEXTURE_BARRIER:
return 1;
case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
return 0;
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
case PIPE_CAP_VERTEX_COLOR_CLAMPED:
return 1;
case PIPE_CAP_USER_CONSTANT_BUFFERS:
case PIPE_CAP_USER_VERTEX_BUFFERS:
return 1;
default:
return 0;
}
}
static bool