zink: remove zink_get_param and zink_get_paramf

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32955>
This commit is contained in:
Qiang Yu 2025-01-07 17:36:31 +08:00 committed by Marge Bot
parent ae12e6b325
commit fe1d5d55f1

View file

@ -547,582 +547,6 @@ have_fp32_filter_linear(struct zink_screen *screen)
return true;
}
static int
zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
{
struct zink_screen *screen = zink_screen(pscreen);
switch (param) {
case PIPE_CAP_NULL_TEXTURES:
return screen->info.rb_image_feats.robustImageAccess;
case PIPE_CAP_MULTIVIEW:
/* support OVR_multiview and OVR_multiview2 */
return screen->info.have_vulkan13 ? 2 * screen->info.feats11.multiview : 0;
case PIPE_CAP_TEXRECT:
case PIPE_CAP_MULTI_DRAW_INDIRECT_PARTIAL_STRIDE:
return 0;
case PIPE_CAP_ANISOTROPIC_FILTER:
return screen->info.feats.features.samplerAnisotropy;
case PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART:
return 1;
case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: {
uint32_t modes = BITFIELD_BIT(MESA_PRIM_LINE_STRIP) |
BITFIELD_BIT(MESA_PRIM_TRIANGLE_STRIP) |
BITFIELD_BIT(MESA_PRIM_LINE_STRIP_ADJACENCY) |
BITFIELD_BIT(MESA_PRIM_TRIANGLE_STRIP_ADJACENCY);
if (screen->have_triangle_fans)
modes |= BITFIELD_BIT(MESA_PRIM_TRIANGLE_FAN);
if (screen->info.have_EXT_primitive_topology_list_restart) {
modes |= BITFIELD_BIT(MESA_PRIM_POINTS) |
BITFIELD_BIT(MESA_PRIM_LINES) |
BITFIELD_BIT(MESA_PRIM_LINES_ADJACENCY) |
BITFIELD_BIT(MESA_PRIM_TRIANGLES) |
BITFIELD_BIT(MESA_PRIM_TRIANGLES_ADJACENCY);
if (screen->info.list_restart_feats.primitiveTopologyPatchListRestart)
modes |= BITFIELD_BIT(MESA_PRIM_PATCHES);
}
return modes;
}
case PIPE_CAP_SUPPORTED_PRIM_MODES: {
uint32_t modes = BITFIELD_MASK(MESA_PRIM_COUNT);
if (!screen->have_triangle_fans || !screen->info.feats.features.geometryShader)
modes &= ~BITFIELD_BIT(MESA_PRIM_QUADS);
modes &= ~BITFIELD_BIT(MESA_PRIM_QUAD_STRIP);
modes &= ~BITFIELD_BIT(MESA_PRIM_POLYGON);
modes &= ~BITFIELD_BIT(MESA_PRIM_LINE_LOOP);
if (!screen->have_triangle_fans)
modes &= ~BITFIELD_BIT(MESA_PRIM_TRIANGLE_FAN);
return modes;
}
case PIPE_CAP_FBFETCH:
#if defined(MVK_VERSION)
return 0;
#else
return 1;
#endif
case PIPE_CAP_FBFETCH_COHERENT:
return screen->info.have_EXT_rasterization_order_attachment_access;
case PIPE_CAP_MEMOBJ:
return screen->instance_info.have_KHR_external_memory_capabilities && (screen->info.have_KHR_external_memory_fd || screen->info.have_KHR_external_memory_win32);
case PIPE_CAP_FENCE_SIGNAL:
return screen->info.have_KHR_external_semaphore_fd || screen->info.have_KHR_external_semaphore_win32;
case PIPE_CAP_NATIVE_FENCE_FD:
return screen->instance_info.have_KHR_external_semaphore_capabilities && screen->info.have_KHR_external_semaphore_fd;
case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
return screen->info.have_EXT_external_memory_host;
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
return screen->info.have_vulkan11 || screen->info.have_KHR_maintenance2;
case PIPE_CAP_VALIDATE_ALL_DIRTY_STATES:
case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
case PIPE_CAP_MAP_UNSYNCHRONIZED_THREAD_SAFE:
case PIPE_CAP_SHAREABLE_SHADERS:
case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
case PIPE_CAP_QUERY_MEMORY_INFO:
case PIPE_CAP_NPOT_TEXTURES:
case PIPE_CAP_TGSI_TEXCOORD:
case PIPE_CAP_DRAW_INDIRECT:
case PIPE_CAP_TEXTURE_QUERY_LOD:
case PIPE_CAP_GLSL_TESS_LEVELS_AS_INPUTS:
case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
case PIPE_CAP_SHADER_ARRAY_COMPONENTS:
case PIPE_CAP_QUERY_BUFFER_OBJECT:
case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
case PIPE_CAP_CLIP_HALFZ:
case PIPE_CAP_TEXTURE_QUERY_SAMPLES:
case PIPE_CAP_TEXTURE_BARRIER:
case PIPE_CAP_QUERY_SO_OVERFLOW:
case PIPE_CAP_GL_SPIRV:
case PIPE_CAP_CLEAR_SCISSORED:
case PIPE_CAP_INVALIDATE_BUFFER:
case PIPE_CAP_PREFER_REAL_BUFFER_IN_CONSTBUF0:
case PIPE_CAP_PACKED_UNIFORMS:
case PIPE_CAP_SHADER_PACK_HALF_FLOAT:
case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
case PIPE_CAP_LOAD_CONSTBUF:
case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
case PIPE_CAP_ALLOW_GLTHREAD_BUFFER_SUBDATA_OPT:
case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
case PIPE_CAP_CALL_FINALIZE_NIR_IN_LINKER:
return 1;
case PIPE_CAP_DRAW_VERTEX_STATE:
return screen->info.have_EXT_vertex_input_dynamic_state;
case PIPE_CAP_SURFACE_SAMPLE_COUNT:
return screen->vk_version >= VK_MAKE_VERSION(1,2,0);
case PIPE_CAP_SHADER_GROUP_VOTE:
if (screen->info.have_vulkan11 &&
(screen->info.subgroup.supportedOperations & VK_SUBGROUP_FEATURE_VOTE_BIT) &&
(screen->info.subgroup.supportedStages & VK_SHADER_STAGE_COMPUTE_BIT))
return true;
if (screen->info.have_EXT_shader_subgroup_vote)
return true;
return false;
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
return 1;
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
return screen->info.have_KHR_sampler_mirror_clamp_to_edge || (screen->info.have_vulkan12 && screen->info.feats12.samplerMirrorClampToEdge);
case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
return 1;
case PIPE_CAP_POLYGON_OFFSET_CLAMP:
return screen->info.feats.features.depthBiasClamp;
case PIPE_CAP_QUERY_PIPELINE_STATISTICS_SINGLE:
return screen->info.feats.features.pipelineStatisticsQuery;
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
return screen->info.feats.features.robustBufferAccess &&
(screen->info.rb2_feats.robustImageAccess2 || screen->driver_compiler_workarounds.lower_robustImageAccess2);
case PIPE_CAP_MULTI_DRAW_INDIRECT:
return screen->info.feats.features.multiDrawIndirect;
case PIPE_CAP_IMAGE_ATOMIC_FLOAT_ADD:
return (screen->info.have_EXT_shader_atomic_float &&
screen->info.atomic_float_feats.shaderSharedFloat32AtomicAdd &&
screen->info.atomic_float_feats.shaderBufferFloat32AtomicAdd);
case PIPE_CAP_SHADER_ATOMIC_INT64:
return (screen->info.have_KHR_shader_atomic_int64 &&
screen->info.atomic_int_feats.shaderSharedInt64Atomics &&
screen->info.atomic_int_feats.shaderBufferInt64Atomics);
case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
return screen->info.have_KHR_draw_indirect_count;
case PIPE_CAP_START_INSTANCE:
case PIPE_CAP_DRAW_PARAMETERS:
return (screen->info.have_vulkan12 && screen->info.feats11.shaderDrawParameters) ||
screen->info.have_KHR_shader_draw_parameters;
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
return screen->info.have_EXT_vertex_attribute_divisor;
case PIPE_CAP_MAX_VERTEX_STREAMS:
return screen->info.tf_props.maxTransformFeedbackStreams;
case PIPE_CAP_COMPUTE_SHADER_DERIVATIVES:
return screen->info.have_NV_compute_shader_derivatives;
case PIPE_CAP_INT64:
case PIPE_CAP_DOUBLES:
return 1;
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
if (!screen->info.feats.features.dualSrcBlend)
return 0;
return screen->info.props.limits.maxFragmentDualSrcAttachments;
case PIPE_CAP_MAX_RENDER_TARGETS:
return screen->info.props.limits.maxColorAttachments;
case PIPE_CAP_OCCLUSION_QUERY:
return screen->info.feats.features.occlusionQueryPrecise;
case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS:
return screen->info.have_EXT_sample_locations && screen->info.have_EXT_extended_dynamic_state;
case PIPE_CAP_QUERY_TIME_ELAPSED:
return screen->timestamp_valid_bits > 0;
case PIPE_CAP_TEXTURE_MULTISAMPLE:
return 1;
case PIPE_CAP_FRAGMENT_SHADER_INTERLOCK:
return screen->info.have_EXT_fragment_shader_interlock;
case PIPE_CAP_SHADER_CLOCK:
return screen->info.have_KHR_shader_clock;
case PIPE_CAP_SHADER_BALLOT:
if (screen->info.props11.subgroupSize > 64)
return false;
if (screen->info.have_vulkan11 &&
screen->info.subgroup.supportedOperations & VK_SUBGROUP_FEATURE_BALLOT_BIT)
return true;
if (screen->info.have_EXT_shader_subgroup_ballot)
return true;
return false;
case PIPE_CAP_DEMOTE_TO_HELPER_INVOCATION:
return screen->spirv_version >= SPIRV_VERSION(1, 6) ||
screen->info.have_EXT_shader_demote_to_helper_invocation;
case PIPE_CAP_SAMPLE_SHADING:
return screen->info.feats.features.sampleRateShading;
case PIPE_CAP_TEXTURE_SWIZZLE:
return 1;
case PIPE_CAP_VERTEX_INPUT_ALIGNMENT:
return screen->info.have_EXT_legacy_vertex_attributes ? PIPE_VERTEX_INPUT_ALIGNMENT_NONE : PIPE_VERTEX_INPUT_ALIGNMENT_ELEMENT;
case PIPE_CAP_GL_CLAMP:
return 0;
case PIPE_CAP_PREFER_IMM_ARRAYS_AS_CONSTBUF:
return 0; /* Assume that the vk driver is capable of moving imm arrays to some sort of constant storage on its own. */
case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: {
enum pipe_quirk_texture_border_color_swizzle quirk = PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_ALPHA_NOT_W;
if (!screen->info.border_color_feats.customBorderColorWithoutFormat)
return quirk | PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_FREEDRENO;
/* assume that if drivers don't implement this extension they either:
* - don't support custom border colors
* - handle things correctly
* - hate border color accuracy
*/
if (screen->info.have_EXT_border_color_swizzle &&
!screen->info.border_swizzle_feats.borderColorSwizzleFromImage)
return quirk | PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50;
return quirk;
}
case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
return MIN2(screen->info.props.limits.maxImageDimension1D,
screen->info.props.limits.maxImageDimension2D);
case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
return 1 + util_logbase2(screen->info.props.limits.maxImageDimension3D);
case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
return 1 + util_logbase2(screen->info.props.limits.maxImageDimensionCube);
case PIPE_CAP_FRAGMENT_SHADER_TEXTURE_LOD:
case PIPE_CAP_FRAGMENT_SHADER_DERIVATIVES:
return 1;
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
case PIPE_CAP_INDEP_BLEND_ENABLE:
case PIPE_CAP_INDEP_BLEND_FUNC:
return screen->info.feats.features.independentBlend;
case PIPE_CAP_DITHERING:
return 0;
case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
return screen->info.have_EXT_transform_feedback ? screen->info.tf_props.maxTransformFeedbackBuffers : 0;
case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
return screen->info.have_EXT_transform_feedback;
case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
return screen->info.props.limits.maxImageArrayLayers;
case PIPE_CAP_DEPTH_CLIP_DISABLE:
return screen->info.have_EXT_depth_clip_enable;
case PIPE_CAP_SHADER_STENCIL_EXPORT:
return screen->info.have_EXT_shader_stencil_export;
case PIPE_CAP_VS_INSTANCEID:
case PIPE_CAP_SEAMLESS_CUBE_MAP:
return 1;
case PIPE_CAP_MIN_TEXEL_OFFSET:
return screen->info.props.limits.minTexelOffset;
case PIPE_CAP_MAX_TEXEL_OFFSET:
return screen->info.props.limits.maxTexelOffset;
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
return 1;
case PIPE_CAP_CONDITIONAL_RENDER:
return 1;
case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY:
case PIPE_CAP_GLSL_FEATURE_LEVEL:
return 460;
case PIPE_CAP_COMPUTE:
return 1;
case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
return screen->info.props.limits.minUniformBufferOffsetAlignment;
case PIPE_CAP_QUERY_TIMESTAMP:
return screen->timestamp_valid_bits > 0;
case PIPE_CAP_QUERY_TIMESTAMP_BITS:
return screen->timestamp_valid_bits;
case PIPE_CAP_TIMER_RESOLUTION:
return ceil(screen->info.props.limits.timestampPeriod);
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
return 1 << MIN_SLAB_ORDER;
case PIPE_CAP_CUBE_MAP_ARRAY:
return screen->info.feats.features.imageCubeArray;
case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
case PIPE_CAP_PRIMITIVE_RESTART:
return 1;
case PIPE_CAP_BINDLESS_TEXTURE:
if (zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_DB &&
(screen->info.db_props.maxDescriptorBufferBindings < 2 || screen->info.db_props.maxSamplerDescriptorBufferBindings < 2))
return 0;
return screen->info.have_EXT_descriptor_indexing;
case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
return screen->info.props.limits.minTexelBufferOffsetAlignment;
case PIPE_CAP_TEXTURE_TRANSFER_MODES: {
enum pipe_texture_transfer_mode mode = PIPE_TEXTURE_TRANSFER_BLIT;
if (!screen->is_cpu &&
screen->info.have_KHR_8bit_storage &&
screen->info.have_KHR_16bit_storage &&
screen->info.have_KHR_shader_float16_int8)
mode |= PIPE_TEXTURE_TRANSFER_COMPUTE;
return mode;
}
case PIPE_CAP_MAX_TEXEL_BUFFER_ELEMENTS_UINT:
return MIN2(get_smallest_buffer_heap(screen),
screen->info.props.limits.maxTexelBufferElements);
case PIPE_CAP_ENDIANNESS:
return PIPE_ENDIAN_NATIVE; /* unsure */
case PIPE_CAP_MAX_VIEWPORTS:
return MIN2(screen->info.props.limits.maxViewports, PIPE_MAX_VIEWPORTS);
case PIPE_CAP_IMAGE_LOAD_FORMATTED:
return screen->info.feats.features.shaderStorageImageReadWithoutFormat;
case PIPE_CAP_IMAGE_STORE_FORMATTED:
return screen->info.feats.features.shaderStorageImageWriteWithoutFormat;
case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
return 1;
case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
return screen->info.props.limits.maxGeometryOutputVertices;
case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
return screen->info.props.limits.maxGeometryTotalOutputComponents;
case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
return 4;
case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
return screen->info.props.limits.minTexelGatherOffset;
case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
return screen->info.props.limits.maxTexelGatherOffset;
case PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB:
return screen->info.feats12.samplerFilterMinmax || screen->info.have_EXT_sampler_filter_minmax;
case PIPE_CAP_OPENCL_INTEGER_FUNCTIONS:
case PIPE_CAP_INTEGER_MULTIPLY_32X16:
return screen->info.have_INTEL_shader_integer_functions2;
case PIPE_CAP_FS_FINE_DERIVATIVE:
return 1;
case PIPE_CAP_VENDOR_ID:
return screen->info.props.vendorID;
case PIPE_CAP_DEVICE_ID:
return screen->info.props.deviceID;
case PIPE_CAP_ACCELERATED:
return !screen->is_cpu;
case PIPE_CAP_VIDEO_MEMORY:
return get_video_mem(screen) >> 20;
case PIPE_CAP_UMA:
return screen->info.props.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
return screen->info.props.limits.maxVertexInputBindingStride;
case PIPE_CAP_SAMPLER_VIEW_TARGET:
return 1;
case PIPE_CAP_VS_LAYER_VIEWPORT:
case PIPE_CAP_TES_LAYER_VIEWPORT:
return screen->info.have_EXT_shader_viewport_index_layer ||
(screen->spirv_version >= SPIRV_VERSION(1, 5) &&
screen->info.feats12.shaderOutputLayer &&
screen->info.feats12.shaderOutputViewportIndex);
case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
return have_fp32_filter_linear(screen);
case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
return 1;
case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
return screen->info.props.limits.minStorageBufferOffsetAlignment;
case PIPE_CAP_PCI_GROUP:
case PIPE_CAP_PCI_BUS:
case PIPE_CAP_PCI_DEVICE:
case PIPE_CAP_PCI_FUNCTION:
return 0; /* TODO: figure these out */
case PIPE_CAP_CULL_DISTANCE:
return screen->info.feats.features.shaderCullDistance;
case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
return screen->info.feats.features.sparseResidencyBuffer ? ZINK_SPARSE_BUFFER_PAGE_SIZE : 0;
/* Sparse texture */
case PIPE_CAP_MAX_SPARSE_TEXTURE_SIZE:
return screen->info.feats.features.sparseResidencyImage2D ?
zink_get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE) : 0;
case PIPE_CAP_MAX_SPARSE_3D_TEXTURE_SIZE:
return screen->info.feats.features.sparseResidencyImage3D ?
(1 << (zink_get_param(pscreen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS) - 1)) : 0;
case PIPE_CAP_MAX_SPARSE_ARRAY_TEXTURE_LAYERS:
return screen->info.feats.features.sparseResidencyImage2D ?
zink_get_param(pscreen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS) : 0;
case PIPE_CAP_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS:
return screen->info.feats.features.sparseResidencyImage2D ? 1 : 0;
case PIPE_CAP_QUERY_SPARSE_TEXTURE_RESIDENCY:
return screen->info.feats.features.sparseResidency2Samples &&
screen->info.feats.features.shaderResourceResidency ? 1 : 0;
case PIPE_CAP_CLAMP_SPARSE_TEXTURE_LOD:
return screen->info.feats.features.shaderResourceMinLod &&
screen->info.feats.features.sparseResidency2Samples &&
screen->info.feats.features.shaderResourceResidency ? 1 : 0;
case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
return screen->info.props.limits.viewportSubPixelBits;
case PIPE_CAP_MAX_GS_INVOCATIONS:
return screen->info.props.limits.maxGeometryShaderInvocations;
case PIPE_CAP_MAX_COMBINED_SHADER_BUFFERS:
/* gallium handles this automatically */
return 0;
case PIPE_CAP_MAX_SHADER_BUFFER_SIZE_UINT:
/* 1<<27 is required by VK spec */
assert(screen->info.props.limits.maxStorageBufferRange >= 1 << 27);
/* clamp to VK spec minimum */
return MIN2(get_smallest_buffer_heap(screen), screen->info.props.limits.maxStorageBufferRange);
case PIPE_CAP_FS_COORD_ORIGIN_UPPER_LEFT:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
return 1;
case PIPE_CAP_FS_COORD_ORIGIN_LOWER_LEFT:
case PIPE_CAP_FS_COORD_PIXEL_CENTER_INTEGER:
return 0;
case PIPE_CAP_FS_FACE_IS_INTEGER_SYSVAL:
case PIPE_CAP_FS_POINT_IS_SYSVAL:
return 1;
case PIPE_CAP_VIEWPORT_TRANSFORM_LOWERED:
return 1;
case PIPE_CAP_POINT_SIZE_FIXED:
return screen->info.have_KHR_maintenance5 ? PIPE_POINT_SIZE_LOWER_USER_ONLY : PIPE_POINT_SIZE_LOWER_ALWAYS;
case PIPE_CAP_FLATSHADE:
case PIPE_CAP_ALPHA_TEST:
case PIPE_CAP_CLIP_PLANES:
case PIPE_CAP_TWO_SIDED_COLOR:
return 0;
case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
return screen->info.props.limits.maxTessellationControlPerPatchOutputComponents / 4;
case PIPE_CAP_MAX_VARYINGS:
/* need to reserve up to 60 of our varying components and 16 slots for streamout */
return MIN2(screen->info.props.limits.maxVertexOutputComponents / 4 / 2, 16);
case PIPE_CAP_DMABUF:
#if defined(HAVE_LIBDRM) && (DETECT_OS_LINUX || DETECT_OS_BSD)
return screen->info.have_KHR_external_memory_fd &&
screen->info.have_EXT_external_memory_dma_buf &&
screen->info.have_EXT_queue_family_foreign
? DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT
: 0;
#else
return 0;
#endif
case PIPE_CAP_DEPTH_BOUNDS_TEST:
return screen->info.feats.features.depthBounds;
case PIPE_CAP_POST_DEPTH_COVERAGE:
return screen->info.have_EXT_post_depth_coverage;
case PIPE_CAP_STRING_MARKER:
return screen->instance_info.have_EXT_debug_utils;
default:
return u_pipe_screen_get_param_defaults(pscreen, param);
}
}
static float
zink_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
{
struct zink_screen *screen = zink_screen(pscreen);
switch (param) {
case PIPE_CAPF_MIN_LINE_WIDTH:
case PIPE_CAPF_MIN_LINE_WIDTH_AA:
if (!screen->info.feats.features.wideLines)
return 1.0f;
return MAX2(screen->info.props.limits.lineWidthRange[0], 0.01);
case PIPE_CAPF_MIN_POINT_SIZE:
case PIPE_CAPF_MIN_POINT_SIZE_AA:
if (!screen->info.feats.features.largePoints)
return 1.0f;
return MAX2(screen->info.props.limits.pointSizeRange[0], 0.01);
case PIPE_CAPF_LINE_WIDTH_GRANULARITY:
if (!screen->info.feats.features.wideLines)
return 0.1f;
return screen->info.props.limits.lineWidthGranularity;
case PIPE_CAPF_POINT_SIZE_GRANULARITY:
if (!screen->info.feats.features.largePoints)
return 0.1f;
return screen->info.props.limits.pointSizeGranularity;
case PIPE_CAPF_MAX_LINE_WIDTH:
case PIPE_CAPF_MAX_LINE_WIDTH_AA:
if (!screen->info.feats.features.wideLines)
return 1.0f;
return screen->info.props.limits.lineWidthRange[1];
case PIPE_CAPF_MAX_POINT_SIZE:
case PIPE_CAPF_MAX_POINT_SIZE_AA:
if (!screen->info.feats.features.largePoints)
return 1.0f;
return screen->info.props.limits.pointSizeRange[1];
case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
if (!screen->info.feats.features.samplerAnisotropy)
return 1.0f;
return screen->info.props.limits.maxSamplerAnisotropy;
case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
return screen->info.props.limits.maxSamplerLodBias;
case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE:
case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE:
case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY:
return 0.0f; /* not implemented */
}
/* should only get here on unhandled cases */
return 0.0f;
}
static int
zink_get_shader_param(struct pipe_screen *pscreen,
gl_shader_stage shader,
@ -4028,8 +3452,6 @@ zink_internal_create_screen(const struct pipe_screen_config *config, int64_t dev
screen->base.get_compute_param = zink_get_compute_param;
screen->base.get_timestamp = zink_get_timestamp;
screen->base.query_memory_info = zink_query_memory_info;
screen->base.get_param = zink_get_param;
screen->base.get_paramf = zink_get_paramf;
screen->base.get_shader_param = zink_get_shader_param;
screen->base.get_compiler_options = zink_get_compiler_options;
screen->base.get_sample_pixel_grid = zink_get_sample_pixel_grid;