1a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie/* 2a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * Copyright 2014, 2015 Red Hat. 3a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * 4a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 5a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * copy of this software and associated documentation files (the "Software"), 6a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * to deal in the Software without restriction, including without limitation 7a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * on the rights to use, copy, modify, merge, publish, distribute, sub 8a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * license, and/or sell copies of the Software, and to permit persons to whom 9a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * the Software is furnished to do so, subject to the following conditions: 10a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * 11a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * The above copyright notice and this permission notice (including the next 12a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * paragraph) shall be included in all copies or substantial portions of the 13a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * Software. 14a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * 15a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE. 22a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie */ 23a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "util/u_memory.h" 24a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "util/u_format.h" 25a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "util/u_format_s3tc.h" 26a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "util/u_video.h" 27a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "os/os_time.h" 28a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "pipe/p_defines.h" 29a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "pipe/p_screen.h" 30a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "draw/draw_context.h" 31a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 32a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "tgsi/tgsi_exec.h" 33a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 340c82c2fb0b5d7c3b481190667a481bf2dd126e36Emil Velikov#include "virgl_screen.h" 35a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "virgl_resource.h" 36a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "virgl_public.h" 37a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#include "virgl_context.h" 38a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 39a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#define SP_MAX_TEXTURE_2D_LEVELS 15 /* 16K x 16K */ 40a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#define SP_MAX_TEXTURE_3D_LEVELS 9 /* 512 x 512 x 512 */ 41a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie#define SP_MAX_TEXTURE_CUBE_LEVELS 13 /* 4K x 4K */ 42a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 43a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic const char * 44a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_get_vendor(struct pipe_screen *screen) 45a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 46a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return "Red Hat"; 47a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 48a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 49a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 50a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic const char * 51a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_get_name(struct pipe_screen *screen) 52a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 53a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return "virgl"; 54a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 55a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 56a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic int 57a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_get_param(struct pipe_screen *screen, enum pipe_cap param) 58a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 59a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 60a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie switch (param) { 61a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_NPOT_TEXTURES: 62a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 63a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TWO_SIDED_STENCIL: 64a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 65a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SM3: 66a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 67a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_ANISOTROPIC_FILTER: 68a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 69a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_POINT_SPRITE: 70a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 71a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_RENDER_TARGETS: 72a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_render_targets; 73a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: 74a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_dual_source_render_targets; 75a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_OCCLUSION_QUERY: 76a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.occlusion_query; 77a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 78a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.mirror_clamp; 79a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_SHADOW_MAP: 80a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 81a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_SWIZZLE: 82a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 83a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 84a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return SP_MAX_TEXTURE_2D_LEVELS; 85a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 86a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return SP_MAX_TEXTURE_3D_LEVELS; 87a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 88a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return SP_MAX_TEXTURE_CUBE_LEVELS; 89a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_BLEND_EQUATION_SEPARATE: 90a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 91a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_INDEP_BLEND_ENABLE: 92a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.indep_blend_enable; 93a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_INDEP_BLEND_FUNC: 94a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.indep_blend_func; 95a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 96a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 97a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 98a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 99a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.fragment_coord_conventions; 100a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_DEPTH_CLIP_DISABLE: 101a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.depth_clip_disable; 102a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: 103a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_streamout_buffers; 104a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: 105a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: 106a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16*4; 107a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_PRIMITIVE_RESTART: 108a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.primitive_restart; 109a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SHADER_STENCIL_EXPORT: 110a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.shader_stencil_export; 111a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_INSTANCEID: 112a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 113a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 114a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SEAMLESS_CUBE_MAP: 115a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.seamless_cube_map; 116a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: 117a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.seamless_cube_map_per_texture; 118a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: 119a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_texture_array_layers; 120a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MIN_TEXEL_OFFSET: 121a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: 122a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return -8; 123a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXEL_OFFSET: 124a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: 125a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 7; 126a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_CONDITIONAL_RENDER: 127a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.conditional_render; 128a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_BARRIER: 129a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 130a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: 131a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 132a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: 133a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEX_COLOR_CLAMPED: 134a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.color_clamping; 135a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: 136a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 137a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_GLSL_FEATURE_LEVEL: 138a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.glsl_level; 139a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: 140a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 141a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_COMPUTE: 142a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 143a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_USER_VERTEX_BUFFERS: 144a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 145a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_USER_INDEX_BUFFERS: 146a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_USER_CONSTANT_BUFFERS: 147a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 148a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: 149a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16; 150a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: 1513fdeb7c983d5a6e8704024dc841ff217377ba284Ilia Mirkin case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: 152a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.streamout_pause_resume; 153a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_START_INSTANCE: 154a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.start_instance; 155a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: 156a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: 157a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: 158a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: 159a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: 160a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 161a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_QUERY_TIMESTAMP: 162a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 163a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_QUERY_TIME_ELAPSED: 164a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 165a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_TEXCOORD: 166a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 167a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: 168a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return VIRGL_MAP_BUFFER_ALIGNMENT; 169a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: 170a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_tbo_size > 0; 171a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: 172a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 1733abb548ef681a63a077f7e6cbf36988426b244c0Nicolai Hähnle case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY: 1743abb548ef681a63a077f7e6cbf36988426b244c0Nicolai Hähnle return 0; 175a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_CUBE_MAP_ARRAY: 176a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.cube_map_array; 177a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_MULTISAMPLE: 178a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.texture_multisample; 179a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_VIEWPORTS: 180a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_viewports; 181a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: 182a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_tbo_size; 183a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: 184a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_QUERY_PIPELINE_STATISTICS: 185a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_ENDIANNESS: 186a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 187a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: 1889515d651f95d58feea64d1c4c989a216ff83f8b4Ilia Mirkin case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: 189a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 190a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: 191a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 192a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES: 193c7cc264ca97fe52688f26dd9249a68f574b18f56Dave Airlie return 256; 194a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: 195a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16384; 196a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_QUERY_LOD: 197a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.bset.texture_query_lod; 198a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: 199a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_texture_gather_components; 200a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_GATHER_SM5: 201a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: 202a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SAMPLE_SHADING: 203a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_FAKE_SW_MSAA: 204a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_GATHER_OFFSETS: 205a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: 206a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_VERTEX_STREAMS: 207a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_DRAW_INDIRECT: 208d67b9ba9a1af18306aa68f16ee1b9bbc124da42eIlia Mirkin case PIPE_CAP_MULTI_DRAW_INDIRECT: 209d67b9ba9a1af18306aa68f16ee1b9bbc124da42eIlia Mirkin case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: 210a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: 211a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: 212a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE: 213a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SAMPLER_VIEW_TARGET: 214a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_CLIP_HALFZ: 215a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VERTEXID_NOBASE: 216a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_POLYGON_OFFSET_CLAMP: 217a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MULTISAMPLE_Z_RESOLVE: 218a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: 219a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: 220a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS: 221a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_FLOAT_LINEAR: 222a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: 223a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_DEPTH_BOUNDS_TEST: 224a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_TGSI_TXQS: 225a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_FORCE_PERSAMPLE_INTERP: 226a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_SHAREABLE_SHADERS: 2273695b253f908b58290d69e2d770209abf0c6beeeIlia Mirkin case PIPE_CAP_CLEAR_TEXTURE: 22887b4e4e29fb2013ce2f0770f39113069bd16057cIlia Mirkin case PIPE_CAP_DRAW_PARAMETERS: 229e9f43d6333657d3f6c47c656fbbe18aaebbe804aIlia Mirkin case PIPE_CAP_TGSI_PACK_HALF_FLOAT: 23034738a92dea31ab91edb62bf83a3fe1ca44c35a1Marek Olšák case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: 23134738a92dea31ab91edb62bf83a3fe1ca44c35a1Marek Olšák case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: 232ebfb5446c78cd3e9f3f3e92fef88e4b0645a34e8Ilia Mirkin case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT: 233654670b4048ae079879a04c41829902060a93931Nicolai Hähnle case PIPE_CAP_INVALIDATE_BUFFER: 2343038e8984df2be35a7164043ec6d385e32e26238Charmaine Lee case PIPE_CAP_GENERATE_MIPMAP: 2356af6d7b08af5d14b7a5848c87c01ae3c711c7963Nicolai Hähnle case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS: 236f9e6f46335be94b19b01be21ca872d9cc93c82e9Ilia Mirkin case PIPE_CAP_QUERY_BUFFER_OBJECT: 237840aa52f50cb9a37659768afea389bcf29ea7c96Dave Airlie case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: 238840aa52f50cb9a37659768afea389bcf29ea7c96Dave Airlie case PIPE_CAP_STRING_MARKER: 239840aa52f50cb9a37659768afea389bcf29ea7c96Dave Airlie case PIPE_CAP_QUERY_MEMORY_INFO: 240dcb2b7782317cf06c1c98472c9a34d2c9dfffae7Marek Olšák case PIPE_CAP_PCI_GROUP: 241dcb2b7782317cf06c1c98472c9a34d2c9dfffae7Marek Olšák case PIPE_CAP_PCI_BUS: 242dcb2b7782317cf06c1c98472c9a34d2c9dfffae7Marek Olšák case PIPE_CAP_PCI_DEVICE: 243dcb2b7782317cf06c1c98472c9a34d2c9dfffae7Marek Olšák case PIPE_CAP_PCI_FUNCTION: 2444bc9130fba2f815cb910536d3d3a253a8c3ed0b9Edward O'Callaghan case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: 24570dcd841f7d94a7b44b294d5264324fc5905aae8Bas Nieuwenhuizen case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: 246b19a0d506d33bff513d07a41b0ba51930464ab8fDave Airlie case PIPE_CAP_CULL_DISTANCE: 24770048eb1e3bc155b2b6f3554e6a03fb239082f2dKenneth Graunke case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: 248edfa7a4b25839fb7bda71ce42af9a0a02c7c5b27Ilia Mirkin case PIPE_CAP_TGSI_VOTE: 24907fcb06fe0220a51ad20b6b8a70512071999182cIlia Mirkin case PIPE_CAP_MAX_WINDOW_RECTANGLES: 25059a692916ca251db995050f7fc0bb7b4e6e4780bAxel Davy case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: 2513cd28fe3de203934f2bab33cce7a91da499c7376Józef Kucia case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS: 252700a571f8963cff4bff230e8e9b25da0bdce4f54Nicolai Hähnle case PIPE_CAP_TGSI_ARRAY_COMPONENTS: 253611166b8ed08ce39f835385b8e08e37754edcf7bNicolai Hähnle case PIPE_CAP_TGSI_CAN_READ_OUTPUTS: 254e51baeb6c1386681d8f9c285a8f4912d91fad7eeMarek Olšák case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: 255ee3ebe68f949f1e365029db217808303692863a2Ilia Mirkin case PIPE_CAP_TGSI_FS_FBFETCH: 256a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 257a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VENDOR_ID: 258a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0x1af4; 259a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_DEVICE_ID: 260a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0x1010; 261a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_ACCELERATED: 262a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 263a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_UMA: 264a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAP_VIDEO_MEMORY: 265a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 266026a7223a6c9dcd7c59b95dbaf5e64b7258f8700Rob Clark case PIPE_CAP_NATIVE_FENCE_FD: 267026a7223a6c9dcd7c59b95dbaf5e64b7258f8700Rob Clark return 0; 268a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 269a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* should only get here on unhandled cases */ 270a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie debug_printf("Unexpected PIPE_CAP %d query\n", param); 271a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 272a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 273a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 274a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic int 275a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) 276a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 277a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 278a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie switch(shader) 279a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie { 280a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_FRAGMENT: 281a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_VERTEX: 282a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_GEOMETRY: 283a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie switch (param) { 284a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: 285a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: 286a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: 287a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: 288a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return INT_MAX; 289a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: 290a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: 291a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: 292a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 293a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_INPUTS: 294a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (vscreen->caps.caps.v1.glsl_level < 150) 295a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16; 296c7cc264ca97fe52688f26dd9249a68f574b18f56Dave Airlie return (shader == PIPE_SHADER_VERTEX || 297c7cc264ca97fe52688f26dd9249a68f574b18f56Dave Airlie shader == PIPE_SHADER_GEOMETRY) ? 16 : 32; 298a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_OUTPUTS: 299c7cc264ca97fe52688f26dd9249a68f574b18f56Dave Airlie return 32; 300a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie // case PIPE_SHADER_CAP_MAX_CONSTS: 301a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie // return 4096; 302a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_TEMPS: 303a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 256; 304a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: 305a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.max_uniform_blocks; 306a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie // case PIPE_SHADER_CAP_MAX_ADDRS: 307a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie // return 1; 308a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_PREDS: 309a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 310a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_SUBROUTINES: 311a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 1; 312a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 313a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16; 314a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_INTEGERS: 315a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vscreen->caps.caps.v1.glsl_level >= 130; 316a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: 317a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 32; 318a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: 319a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 4096 * sizeof(float[4]); 32072217d433599041f28bc30bb8e184647e7679e39Marek Olšák case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD: 321a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie default: 322a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 323a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 324a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie default: 325a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0; 326a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 327a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 328a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 329a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic float 330a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_get_paramf(struct pipe_screen *screen, enum pipe_capf param) 331a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 332a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie switch (param) { 333a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_MAX_LINE_WIDTH: 334a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* fall-through */ 335a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_MAX_LINE_WIDTH_AA: 336a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 255.0; /* arbitrary */ 337a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_MAX_POINT_WIDTH: 338a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* fall-through */ 339a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_MAX_POINT_WIDTH_AA: 340a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 255.0; /* arbitrary */ 341a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: 342a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16.0; 343a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: 344a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 16.0; /* arbitrary */ 345a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_GUARD_BAND_LEFT: 346a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_GUARD_BAND_TOP: 347a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_GUARD_BAND_RIGHT: 348a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie case PIPE_CAPF_GUARD_BAND_BOTTOM: 349a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0.0; 350a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 351a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* should only get here on unhandled cases */ 352a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie debug_printf("Unexpected PIPE_CAPF %d query\n", param); 353a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return 0.0; 354a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 355a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 356a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic boolean 357a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_is_vertex_format_supported(struct pipe_screen *screen, 358a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie enum pipe_format format) 359a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 360a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 361a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie const struct util_format_description *format_desc; 362a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int i; 363a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 364a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie format_desc = util_format_description(format); 365a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!format_desc) 366a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 367a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 368a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format == PIPE_FORMAT_R11G11B10_FLOAT) { 369a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int vformat = VIRGL_FORMAT_R11G11B10_FLOAT; 370a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int big = vformat / 32; 371a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int small = vformat % 32; 372a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!(vscreen->caps.caps.v1.vertexbuffer.bitmask[big] & (1 << small))) 373a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 374a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return TRUE; 375a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 376a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 377a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* Find the first non-VOID channel. */ 378a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie for (i = 0; i < 4; i++) { 379a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 380a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie break; 381a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 382a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 383a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 384a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (i == 4) 385a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 386a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 387a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) 388a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 389a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 390a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED) 391a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 392a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return TRUE; 393a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 394a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 395a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie/** 396a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * Query format support for creating a texture, drawing surface, etc. 397a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * \param format the format to test 398a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * \param type one of PIPE_TEXTURE, PIPE_SURFACE 399a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie */ 400a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic boolean 401a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_is_format_supported( struct pipe_screen *screen, 402a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie enum pipe_format format, 403a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie enum pipe_texture_target target, 404a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie unsigned sample_count, 405a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie unsigned bind) 406a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 407a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 408a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie const struct util_format_description *format_desc; 409a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int i; 410a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 411a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie assert(target == PIPE_BUFFER || 412a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_1D || 413a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_1D_ARRAY || 414a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_2D || 415a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_2D_ARRAY || 416a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_RECT || 417a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_3D || 418a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_CUBE || 419a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie target == PIPE_TEXTURE_CUBE_ARRAY); 420a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 421a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie format_desc = util_format_description(format); 422a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!format_desc) 423a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 424a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 425a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (util_format_is_intensity(format)) 426a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 427a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 428a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (sample_count > 1) { 429a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!vscreen->caps.caps.v1.bset.texture_multisample) 430a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 431a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (sample_count > vscreen->caps.caps.v1.max_samples) 432a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 433a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 434a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 435a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (bind & PIPE_BIND_VERTEX_BUFFER) { 436a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return virgl_is_vertex_format_supported(screen, format); 437a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 438a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 439a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (bind & PIPE_BIND_RENDER_TARGET) { 440a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) 441a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 442a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 443a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* 444a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * Although possible, it is unnatural to render into compressed or YUV 445a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * surfaces. So disable these here to avoid going into weird paths 446a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * inside the state trackers. 447a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie */ 448a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->block.width != 1 || 449a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie format_desc->block.height != 1) 450a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 451a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 452a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie { 453a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int big = format / 32; 454a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int small = format % 32; 455a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!(vscreen->caps.caps.v1.render.bitmask[big] & (1 << small))) 456a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 457a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 458a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 459a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 460a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (bind & PIPE_BIND_DEPTH_STENCIL) { 461a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 462a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 463a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 464a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 465a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* 466a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * All other operations (sampling, transfer, etc). 467a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie */ 468a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 469a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 470a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (util_format_s3tc_enabled) 471a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie goto out_lookup; 472a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 473a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 474a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->layout == UTIL_FORMAT_LAYOUT_RGTC) { 475a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie goto out_lookup; 476a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 477a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 478a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format == PIPE_FORMAT_R11G11B10_FLOAT) { 479a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie goto out_lookup; 480a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } else if (format == PIPE_FORMAT_R9G9B9E5_FLOAT) { 481a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie goto out_lookup; 482a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 483a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 484a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* Find the first non-VOID channel. */ 485a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie for (i = 0; i < 4; i++) { 486a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) { 487a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie break; 488a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 489a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 490a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 491a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (i == 4) 492a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 493a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 494a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* no L4A4 */ 495a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (format_desc->nr_channels < 4 && format_desc->channel[i].size == 4) 496a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 497a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 498a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie out_lookup: 499a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie { 500a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int big = format / 32; 501a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie int small = format % 32; 502a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!(vscreen->caps.caps.v1.sampler.bitmask[big] & (1 << small))) 503a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return FALSE; 504a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie } 505a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie /* 506a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie * Everything else should be supported by u_format. 507a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie */ 508a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return TRUE; 509a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 510a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 511a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic void virgl_flush_frontbuffer(struct pipe_screen *screen, 512a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct pipe_resource *res, 513a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie unsigned level, unsigned layer, 514a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie void *winsys_drawable_handle, struct pipe_box *sub_box) 515a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 516a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 517a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_winsys *vws = vscreen->vws; 5187af46b9c747cbd503a2b97f00f1c603f1b75aaffEmil Velikov struct virgl_resource *vres = virgl_resource(res); 519a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 520a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (vws->flush_frontbuffer) 521a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie vws->flush_frontbuffer(vws, vres->hw_res, level, layer, winsys_drawable_handle, 522a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie sub_box); 523a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 524a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 525a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic void virgl_fence_reference(struct pipe_screen *screen, 526a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct pipe_fence_handle **ptr, 527a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct pipe_fence_handle *fence) 528a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 529a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 530a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_winsys *vws = vscreen->vws; 531a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 532a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie vws->fence_reference(vws, ptr, fence); 533a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 534a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 535a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic boolean virgl_fence_finish(struct pipe_screen *screen, 53654272e18a682c8b82d4a86b2c07b51c303d8ceadMarek Olšák struct pipe_context *ctx, 537a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct pipe_fence_handle *fence, 538a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie uint64_t timeout) 539a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 540a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 541a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_winsys *vws = vscreen->vws; 542a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 543a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return vws->fence_wait(vws, fence, timeout); 544a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 545a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 546a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic uint64_t 547a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_get_timestamp(struct pipe_screen *_screen) 548a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 549a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return os_time_get_nano(); 550a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 551a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 552a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestatic void 553a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_destroy_screen(struct pipe_screen *screen) 554a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 555a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *vscreen = virgl_screen(screen); 556a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_winsys *vws = vscreen->vws; 557a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 5588a943564fd7ebacd2437bb907535b7765ff448e4Nicolai Hähnle slab_destroy_parent(&vscreen->texture_transfer_pool); 5598a943564fd7ebacd2437bb907535b7765ff448e4Nicolai Hähnle 560a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (vws) 561a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie vws->destroy(vws); 562a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie FREE(vscreen); 563a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 564a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 565a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airliestruct pipe_screen * 566a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlievirgl_create_screen(struct virgl_winsys *vws) 567a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie{ 568a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie struct virgl_screen *screen = CALLOC_STRUCT(virgl_screen); 569a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 570a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie if (!screen) 571a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return NULL; 572a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 573a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->vws = vws; 574a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.get_name = virgl_get_name; 575a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.get_vendor = virgl_get_vendor; 576a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.get_param = virgl_get_param; 577a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.get_shader_param = virgl_get_shader_param; 578a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.get_paramf = virgl_get_paramf; 579a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.is_format_supported = virgl_is_format_supported; 580a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.destroy = virgl_destroy_screen; 581a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.context_create = virgl_context_create; 582a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.flush_frontbuffer = virgl_flush_frontbuffer; 583a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.get_timestamp = virgl_get_timestamp; 584a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.fence_reference = virgl_fence_reference; 585a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie //screen->base.fence_signalled = virgl_fence_signalled; 586a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie screen->base.fence_finish = virgl_fence_finish; 587a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 588a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie virgl_init_screen_resource_functions(&screen->base); 589a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 590a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie vws->get_caps(vws, &screen->caps); 591a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 592f87330dbce3f67cb531194f63a5db59685dcbbd3Rob Herring screen->refcnt = 1; 593a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie 5948a943564fd7ebacd2437bb907535b7765ff448e4Nicolai Hähnle slab_create_parent(&screen->texture_transfer_pool, sizeof(struct virgl_transfer), 16); 5958a943564fd7ebacd2437bb907535b7765ff448e4Nicolai Hähnle 596a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie util_format_s3tc_init(); 597a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie return &screen->base; 598a8987b88ff1db4ac00720a9b56c4bc3aeb666537Dave Airlie} 599