sp_screen.c revision 01e04c3f
1/************************************************************************** 2 * 3 * Copyright 2008 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 29#include "util/u_memory.h" 30#include "util/u_format.h" 31#include "util/u_format_s3tc.h" 32#include "util/u_screen.h" 33#include "util/u_video.h" 34#include "util/os_misc.h" 35#include "util/os_time.h" 36#include "pipe/p_defines.h" 37#include "pipe/p_screen.h" 38#include "draw/draw_context.h" 39 40#include "state_tracker/sw_winsys.h" 41#include "tgsi/tgsi_exec.h" 42 43#include "sp_texture.h" 44#include "sp_screen.h" 45#include "sp_context.h" 46#include "sp_fence.h" 47#include "sp_public.h" 48 49DEBUG_GET_ONCE_BOOL_OPTION(use_llvm, "SOFTPIPE_USE_LLVM", FALSE) 50 51static const char * 52softpipe_get_vendor(struct pipe_screen *screen) 53{ 54 return "VMware, Inc."; 55} 56 57 58static const char * 59softpipe_get_name(struct pipe_screen *screen) 60{ 61 return "softpipe"; 62} 63 64 65static int 66softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) 67{ 68 switch (param) { 69 case PIPE_CAP_NPOT_TEXTURES: 70 case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: 71 case PIPE_CAP_MIXED_COLOR_DEPTH_BITS: 72 return 1; 73 case PIPE_CAP_SM3: 74 return 1; 75 case PIPE_CAP_ANISOTROPIC_FILTER: 76 return 1; 77 case PIPE_CAP_POINT_SPRITE: 78 return 1; 79 case PIPE_CAP_MAX_RENDER_TARGETS: 80 return PIPE_MAX_COLOR_BUFS; 81 case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: 82 return 1; 83 case PIPE_CAP_OCCLUSION_QUERY: 84 return 1; 85 case PIPE_CAP_QUERY_TIME_ELAPSED: 86 return 1; 87 case PIPE_CAP_QUERY_PIPELINE_STATISTICS: 88 return 1; 89 case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 90 case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE: 91 return 1; 92 case PIPE_CAP_TEXTURE_SWIZZLE: 93 return 1; 94 case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK: 95 case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET: 96 return 0; 97 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 98 return SP_MAX_TEXTURE_2D_LEVELS; 99 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 100 return SP_MAX_TEXTURE_3D_LEVELS; 101 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 102 return SP_MAX_TEXTURE_CUBE_LEVELS; 103 case PIPE_CAP_BLEND_EQUATION_SEPARATE: 104 return 1; 105 case PIPE_CAP_INDEP_BLEND_ENABLE: 106 return 1; 107 case PIPE_CAP_INDEP_BLEND_FUNC: 108 return 1; 109 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 110 case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 111 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 112 case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 113 return 1; 114 case PIPE_CAP_DEPTH_CLIP_DISABLE: 115 return 1; 116 case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: 117 return PIPE_MAX_SO_BUFFERS; 118 case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: 119 case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: 120 return 16*4; 121 case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES: 122 case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: 123 return 1024; 124 case PIPE_CAP_MAX_VERTEX_STREAMS: 125 return 1; 126 case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE: 127 return 2048; 128 case PIPE_CAP_PRIMITIVE_RESTART: 129 return 1; 130 case PIPE_CAP_SHADER_STENCIL_EXPORT: 131 return 1; 132 case PIPE_CAP_TGSI_INSTANCEID: 133 case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 134 case PIPE_CAP_START_INSTANCE: 135 return 1; 136 case PIPE_CAP_SEAMLESS_CUBE_MAP: 137 case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: 138 return 1; 139 case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: 140 return 256; /* for GL3 */ 141 case PIPE_CAP_MIN_TEXEL_OFFSET: 142 return -8; 143 case PIPE_CAP_MAX_TEXEL_OFFSET: 144 return 7; 145 case PIPE_CAP_CONDITIONAL_RENDER: 146 return 1; 147 case PIPE_CAP_TEXTURE_BARRIER: 148 case PIPE_CAP_DEPTH_CLIP_DISABLE_SEPARATE: 149 return 0; 150 case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: 151 case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: /* draw module */ 152 case PIPE_CAP_VERTEX_COLOR_CLAMPED: /* draw module */ 153 return 1; 154 case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: 155 return 0; 156 case PIPE_CAP_GLSL_FEATURE_LEVEL: 157 return 330; 158 case PIPE_CAP_GLSL_FEATURE_LEVEL_COMPATIBILITY: 159 return 140; 160 case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: 161 case PIPE_CAP_TGSI_TEX_TXF_LZ: 162 return 0; 163 case PIPE_CAP_COMPUTE: 164 return 1; 165 case PIPE_CAP_USER_VERTEX_BUFFERS: 166 case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: 167 case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: 168 case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: 169 case PIPE_CAP_DOUBLES: 170 case PIPE_CAP_INT64: 171 case PIPE_CAP_INT64_DIVMOD: 172 return 1; 173 case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: 174 return 16; 175 case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: 176 case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: 177 case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: 178 case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: 179 case PIPE_CAP_TEXTURE_MULTISAMPLE: 180 return 0; 181 case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: 182 return 64; 183 case PIPE_CAP_QUERY_TIMESTAMP: 184 case PIPE_CAP_CUBE_MAP_ARRAY: 185 return 1; 186 case PIPE_CAP_TEXTURE_BUFFER_OBJECTS: 187 return 1; 188 case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY: 189 return 0; 190 case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE: 191 return 65536; 192 case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT: 193 return 0; 194 case PIPE_CAP_TGSI_TEXCOORD: 195 case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER: 196 return 0; 197 case PIPE_CAP_MAX_VIEWPORTS: 198 return PIPE_MAX_VIEWPORTS; 199 case PIPE_CAP_ENDIANNESS: 200 return PIPE_ENDIAN_NATIVE; 201 case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: 202 return 4; 203 case PIPE_CAP_TEXTURE_GATHER_SM5: 204 case PIPE_CAP_TEXTURE_QUERY_LOD: 205 return 1; 206 case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: 207 case PIPE_CAP_SAMPLE_SHADING: 208 case PIPE_CAP_TEXTURE_GATHER_OFFSETS: 209 return 0; 210 case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: 211 return 1; 212 case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: 213 return 0; 214 case PIPE_CAP_SAMPLER_VIEW_TARGET: 215 return 1; 216 case PIPE_CAP_FAKE_SW_MSAA: 217 return 1; 218 case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET: 219 return -32; 220 case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET: 221 return 31; 222 case PIPE_CAP_DRAW_INDIRECT: 223 return 1; 224 case PIPE_CAP_QUERY_SO_OVERFLOW: 225 return 1; 226 227 case PIPE_CAP_VENDOR_ID: 228 return 0xFFFFFFFF; 229 case PIPE_CAP_DEVICE_ID: 230 return 0xFFFFFFFF; 231 case PIPE_CAP_ACCELERATED: 232 return 0; 233 case PIPE_CAP_VIDEO_MEMORY: { 234 /* XXX: Do we want to return the full amount fo system memory ? */ 235 uint64_t system_memory; 236 237 if (!os_get_total_physical_memory(&system_memory)) 238 return 0; 239 240 if (sizeof(void *) == 4) 241 /* Cap to 2 GB on 32 bits system. We do this because softpipe does 242 * eat application memory, which is quite limited on 32 bits. App 243 * shouldn't expect too much available memory. */ 244 system_memory = MIN2(system_memory, 2048 << 20); 245 246 return (int)(system_memory >> 20); 247 } 248 case PIPE_CAP_UMA: 249 return 0; 250 case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: 251 return 1; 252 case PIPE_CAP_CLIP_HALFZ: 253 case PIPE_CAP_TEXTURE_FLOAT_LINEAR: 254 case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: 255 return 1; 256 case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: 257 case PIPE_CAP_CULL_DISTANCE: 258 return 1; 259 case PIPE_CAP_VERTEXID_NOBASE: 260 return 0; 261 case PIPE_CAP_POLYGON_OFFSET_CLAMP: 262 return 0; 263 case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS: 264 case PIPE_CAP_TGSI_ARRAY_COMPONENTS: 265 return 1; 266 case PIPE_CAP_CLEAR_TEXTURE: 267 return 1; 268 case PIPE_CAP_MULTISAMPLE_Z_RESOLVE: 269 case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: 270 case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: 271 case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS: 272 case PIPE_CAP_DEPTH_BOUNDS_TEST: 273 case PIPE_CAP_TGSI_TXQS: 274 case PIPE_CAP_FORCE_PERSAMPLE_INTERP: 275 case PIPE_CAP_SHAREABLE_SHADERS: 276 case PIPE_CAP_DRAW_PARAMETERS: 277 case PIPE_CAP_TGSI_PACK_HALF_FLOAT: 278 case PIPE_CAP_MULTI_DRAW_INDIRECT: 279 case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: 280 case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL: 281 case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL: 282 case PIPE_CAP_INVALIDATE_BUFFER: 283 case PIPE_CAP_GENERATE_MIPMAP: 284 case PIPE_CAP_STRING_MARKER: 285 case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS: 286 case PIPE_CAP_QUERY_BUFFER_OBJECT: 287 case PIPE_CAP_QUERY_MEMORY_INFO: 288 case PIPE_CAP_PCI_GROUP: 289 case PIPE_CAP_PCI_BUS: 290 case PIPE_CAP_PCI_DEVICE: 291 case PIPE_CAP_PCI_FUNCTION: 292 case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: 293 case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: 294 case PIPE_CAP_TGSI_VOTE: 295 case PIPE_CAP_MAX_WINDOW_RECTANGLES: 296 case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: 297 case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS: 298 case PIPE_CAP_TGSI_CAN_READ_OUTPUTS: 299 case PIPE_CAP_NATIVE_FENCE_FD: 300 case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY: 301 case PIPE_CAP_TGSI_FS_FBFETCH: 302 case PIPE_CAP_TGSI_MUL_ZERO_WINS: 303 case PIPE_CAP_TGSI_CLOCK: 304 case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE: 305 case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE: 306 case PIPE_CAP_TGSI_BALLOT: 307 case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT: 308 case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX: 309 case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION: 310 case PIPE_CAP_POST_DEPTH_COVERAGE: 311 case PIPE_CAP_BINDLESS_TEXTURE: 312 case PIPE_CAP_NIR_SAMPLERS_AS_DEREF: 313 case PIPE_CAP_MEMOBJ: 314 case PIPE_CAP_LOAD_CONSTBUF: 315 case PIPE_CAP_TGSI_ANY_REG_AS_ADDRESS: 316 case PIPE_CAP_TILE_RASTER_ORDER: 317 case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES: 318 case PIPE_CAP_FRAMEBUFFER_MSAA_CONSTRAINTS: 319 case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET: 320 case PIPE_CAP_CONTEXT_PRIORITY_MASK: 321 case PIPE_CAP_FENCE_SIGNAL: 322 case PIPE_CAP_CONSTBUF0_FLAGS: 323 case PIPE_CAP_PACKED_UNIFORMS: 324 case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES: 325 case PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES: 326 case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES: 327 case PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES: 328 case PIPE_CAP_CONSERVATIVE_RASTER_POST_DEPTH_COVERAGE: 329 case PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS: 330 case PIPE_CAP_PROGRAMMABLE_SAMPLE_LOCATIONS: 331 return 0; 332 case PIPE_CAP_MAX_GS_INVOCATIONS: 333 return 32; 334 case PIPE_CAP_MAX_SHADER_BUFFER_SIZE: 335 return 1 << 27; 336 case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT: 337 return 4; 338 default: 339 return u_pipe_screen_get_param_defaults(screen, param); 340 } 341} 342 343static int 344softpipe_get_shader_param(struct pipe_screen *screen, 345 enum pipe_shader_type shader, 346 enum pipe_shader_cap param) 347{ 348 struct softpipe_screen *sp_screen = softpipe_screen(screen); 349 switch(shader) 350 { 351 case PIPE_SHADER_FRAGMENT: 352 return tgsi_exec_get_shader_param(param); 353 case PIPE_SHADER_COMPUTE: 354 return tgsi_exec_get_shader_param(param); 355 case PIPE_SHADER_VERTEX: 356 case PIPE_SHADER_GEOMETRY: 357 if (sp_screen->use_llvm) 358 return draw_get_shader_param(shader, param); 359 else 360 return draw_get_shader_param_no_llvm(shader, param); 361 default: 362 return 0; 363 } 364} 365 366static float 367softpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param) 368{ 369 switch (param) { 370 case PIPE_CAPF_MAX_LINE_WIDTH: 371 /* fall-through */ 372 case PIPE_CAPF_MAX_LINE_WIDTH_AA: 373 return 255.0; /* arbitrary */ 374 case PIPE_CAPF_MAX_POINT_WIDTH: 375 /* fall-through */ 376 case PIPE_CAPF_MAX_POINT_WIDTH_AA: 377 return 255.0; /* arbitrary */ 378 case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: 379 return 16.0; 380 case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: 381 return 16.0; /* arbitrary */ 382 case PIPE_CAPF_MIN_CONSERVATIVE_RASTER_DILATE: 383 return 0.0; 384 case PIPE_CAPF_MAX_CONSERVATIVE_RASTER_DILATE: 385 return 0.0; 386 case PIPE_CAPF_CONSERVATIVE_RASTER_DILATE_GRANULARITY: 387 return 0.0; 388 } 389 /* should only get here on unhandled cases */ 390 debug_printf("Unexpected PIPE_CAPF %d query\n", param); 391 return 0.0; 392} 393 394/** 395 * Query format support for creating a texture, drawing surface, etc. 396 * \param format the format to test 397 * \param type one of PIPE_TEXTURE, PIPE_SURFACE 398 */ 399static boolean 400softpipe_is_format_supported( struct pipe_screen *screen, 401 enum pipe_format format, 402 enum pipe_texture_target target, 403 unsigned sample_count, 404 unsigned storage_sample_count, 405 unsigned bind) 406{ 407 struct sw_winsys *winsys = softpipe_screen(screen)->winsys; 408 const struct util_format_description *format_desc; 409 410 assert(target == PIPE_BUFFER || 411 target == PIPE_TEXTURE_1D || 412 target == PIPE_TEXTURE_1D_ARRAY || 413 target == PIPE_TEXTURE_2D || 414 target == PIPE_TEXTURE_2D_ARRAY || 415 target == PIPE_TEXTURE_RECT || 416 target == PIPE_TEXTURE_3D || 417 target == PIPE_TEXTURE_CUBE || 418 target == PIPE_TEXTURE_CUBE_ARRAY); 419 420 if (MAX2(1, sample_count) != MAX2(1, storage_sample_count)) 421 return false; 422 423 format_desc = util_format_description(format); 424 if (!format_desc) 425 return FALSE; 426 427 if (sample_count > 1) 428 return FALSE; 429 430 if (bind & (PIPE_BIND_DISPLAY_TARGET | 431 PIPE_BIND_SCANOUT | 432 PIPE_BIND_SHARED)) { 433 if(!winsys->is_displaytarget_format_supported(winsys, bind, format)) 434 return FALSE; 435 } 436 437 if (bind & PIPE_BIND_RENDER_TARGET) { 438 if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) 439 return FALSE; 440 441 /* 442 * Although possible, it is unnatural to render into compressed or YUV 443 * surfaces. So disable these here to avoid going into weird paths 444 * inside the state trackers. 445 */ 446 if (format_desc->block.width != 1 || 447 format_desc->block.height != 1) 448 return FALSE; 449 } 450 451 if (bind & PIPE_BIND_DEPTH_STENCIL) { 452 if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 453 return FALSE; 454 } 455 456 if (format_desc->layout == UTIL_FORMAT_LAYOUT_ASTC) { 457 /* Software decoding is not hooked up. */ 458 return FALSE; 459 } 460 461 if ((bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) && 462 ((bind & PIPE_BIND_DISPLAY_TARGET) == 0) && 463 target != PIPE_BUFFER) { 464 const struct util_format_description *desc = 465 util_format_description(format); 466 if (desc->nr_channels == 3 && desc->is_array) { 467 /* Don't support any 3-component formats for rendering/texturing 468 * since we don't support the corresponding 8-bit 3 channel UNORM 469 * formats. This allows us to support GL_ARB_copy_image between 470 * GL_RGB8 and GL_RGB8UI, for example. Otherwise, we may be asked to 471 * do a resource copy between PIPE_FORMAT_R8G8B8_UINT and 472 * PIPE_FORMAT_R8G8B8X8_UNORM, for example, which will not work 473 * (different bpp). 474 */ 475 return FALSE; 476 } 477 } 478 479 if (format_desc->layout == UTIL_FORMAT_LAYOUT_ETC && 480 format != PIPE_FORMAT_ETC1_RGB8) 481 return FALSE; 482 483 /* 484 * All other operations (sampling, transfer, etc). 485 */ 486 487 /* 488 * Everything else should be supported by u_format. 489 */ 490 return TRUE; 491} 492 493 494static void 495softpipe_destroy_screen( struct pipe_screen *screen ) 496{ 497 struct softpipe_screen *sp_screen = softpipe_screen(screen); 498 struct sw_winsys *winsys = sp_screen->winsys; 499 500 if(winsys->destroy) 501 winsys->destroy(winsys); 502 503 FREE(screen); 504} 505 506 507/* This is often overriden by the co-state tracker. 508 */ 509static void 510softpipe_flush_frontbuffer(struct pipe_screen *_screen, 511 struct pipe_resource *resource, 512 unsigned level, unsigned layer, 513 void *context_private, 514 struct pipe_box *sub_box) 515{ 516 struct softpipe_screen *screen = softpipe_screen(_screen); 517 struct sw_winsys *winsys = screen->winsys; 518 struct softpipe_resource *texture = softpipe_resource(resource); 519 520 assert(texture->dt); 521 if (texture->dt) 522 winsys->displaytarget_display(winsys, texture->dt, context_private, sub_box); 523} 524 525static uint64_t 526softpipe_get_timestamp(struct pipe_screen *_screen) 527{ 528 return os_time_get_nano(); 529} 530 531static int 532softpipe_get_compute_param(struct pipe_screen *_screen, 533 enum pipe_shader_ir ir_type, 534 enum pipe_compute_cap param, 535 void *ret) 536{ 537 switch (param) { 538 case PIPE_COMPUTE_CAP_IR_TARGET: 539 return 0; 540 case PIPE_COMPUTE_CAP_MAX_GRID_SIZE: 541 if (ret) { 542 uint64_t *grid_size = ret; 543 grid_size[0] = 65535; 544 grid_size[1] = 65535; 545 grid_size[2] = 65535; 546 } 547 return 3 * sizeof(uint64_t) ; 548 case PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE: 549 if (ret) { 550 uint64_t *block_size = ret; 551 block_size[0] = 1024; 552 block_size[1] = 1024; 553 block_size[2] = 1024; 554 } 555 return 3 * sizeof(uint64_t); 556 case PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK: 557 if (ret) { 558 uint64_t *max_threads_per_block = ret; 559 *max_threads_per_block = 1024; 560 } 561 return sizeof(uint64_t); 562 case PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE: 563 if (ret) { 564 uint64_t *max_local_size = ret; 565 *max_local_size = 32768; 566 } 567 return sizeof(uint64_t); 568 case PIPE_COMPUTE_CAP_GRID_DIMENSION: 569 case PIPE_COMPUTE_CAP_MAX_GLOBAL_SIZE: 570 case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE: 571 case PIPE_COMPUTE_CAP_MAX_INPUT_SIZE: 572 case PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE: 573 case PIPE_COMPUTE_CAP_MAX_CLOCK_FREQUENCY: 574 case PIPE_COMPUTE_CAP_MAX_COMPUTE_UNITS: 575 case PIPE_COMPUTE_CAP_IMAGES_SUPPORTED: 576 case PIPE_COMPUTE_CAP_SUBGROUP_SIZE: 577 case PIPE_COMPUTE_CAP_ADDRESS_BITS: 578 case PIPE_COMPUTE_CAP_MAX_VARIABLE_THREADS_PER_BLOCK: 579 break; 580 } 581 return 0; 582} 583 584/** 585 * Create a new pipe_screen object 586 * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 587 */ 588struct pipe_screen * 589softpipe_create_screen(struct sw_winsys *winsys) 590{ 591 struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 592 593 if (!screen) 594 return NULL; 595 596 screen->winsys = winsys; 597 598 screen->base.destroy = softpipe_destroy_screen; 599 600 screen->base.get_name = softpipe_get_name; 601 screen->base.get_vendor = softpipe_get_vendor; 602 screen->base.get_device_vendor = softpipe_get_vendor; // TODO should be the CPU vendor 603 screen->base.get_param = softpipe_get_param; 604 screen->base.get_shader_param = softpipe_get_shader_param; 605 screen->base.get_paramf = softpipe_get_paramf; 606 screen->base.get_timestamp = softpipe_get_timestamp; 607 screen->base.is_format_supported = softpipe_is_format_supported; 608 screen->base.context_create = softpipe_create_context; 609 screen->base.flush_frontbuffer = softpipe_flush_frontbuffer; 610 screen->base.get_compute_param = softpipe_get_compute_param; 611 screen->use_llvm = debug_get_option_use_llvm(); 612 613 softpipe_init_screen_texture_funcs(&screen->base); 614 softpipe_init_screen_fence_funcs(&screen->base); 615 616 return &screen->base; 617} 618