sp_screen.c revision cab2fed135bc1edf7b65ddca3236020638427061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************** 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish, 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * the following conditions: 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * The above copyright notice and this permission notice (including the 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * of the Software. 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) **************************************************************************/ 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "util/u_memory.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "util/u_format.h" 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "util/u_format_s3tc.h" 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "util/u_video.h" 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "os/os_time.h" 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pipe/p_defines.h" 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pipe/p_screen.h" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "draw/draw_context.h" 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "vl/vl_decoder.h" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "vl/vl_video_buffer.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "state_tracker/sw_winsys.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tgsi/tgsi_exec.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sp_texture.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sp_screen.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sp_context.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sp_fence.h" 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "sp_public.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEBUG_GET_ONCE_BOOL_OPTION(use_llvm, "SOFTPIPE_USE_LLVM", FALSE) 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const char * 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)softpipe_get_vendor(struct pipe_screen *screen) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "VMware, Inc."; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char * 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)softpipe_get_name(struct pipe_screen *screen) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "softpipe"; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (param) { 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_MAX_COMBINED_SAMPLERS: 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 2 * PIPE_MAX_SAMPLERS; /* VS + FS */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_NPOT_TEXTURES: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_TWO_SIDED_STENCIL: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_SM3: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_ANISOTROPIC_FILTER: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_POINT_SPRITE: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MAX_RENDER_TARGETS: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PIPE_MAX_COLOR_BUFS; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_OCCLUSION_QUERY: 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TIMER_QUERY: 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TEXTURE_SHADOW_MAP: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TEXTURE_SWIZZLE: 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return SP_MAX_TEXTURE_2D_LEVELS; 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return SP_MAX_TEXTURE_3D_LEVELS; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SP_MAX_TEXTURE_CUBE_LEVELS; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_BLEND_EQUATION_SEPARATE: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_INDEP_BLEND_ENABLE: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_INDEP_BLEND_FUNC: 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_DEPTH_CLIP_DISABLE: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PIPE_MAX_SO_BUFFERS; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 16*4; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_PRIMITIVE_RESTART: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE: 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_SHADER_STENCIL_EXPORT: 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TGSI_INSTANCEID: 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_SEAMLESS_CUBE_MAP: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_SCALED_RESOLVE: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 256; /* for GL3 */ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_MIN_TEXEL_OFFSET: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -8; 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_MAX_TEXEL_OFFSET: 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 7; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_CONDITIONAL_RENDER: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_TEXTURE_BARRIER: 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: /* draw module */ 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_VERTEX_COLOR_CLAMPED: /* draw module */ 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_GLSL_FEATURE_LEVEL: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 130; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_COMPUTE: 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return 0; 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case PIPE_CAP_USER_VERTEX_BUFFERS: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_USER_INDEX_BUFFERS: 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_USER_CONSTANT_BUFFERS: 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 16; 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PIPE_CAP_START_INSTANCE: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_CAP_QUERY_TIMESTAMP: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /* should only get here on unhandled cases */ 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) debug_printf("Unexpected PIPE_CAP %d query\n", param); 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) struct softpipe_screen *sp_screen = softpipe_screen(screen); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) switch(shader) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_SHADER_FRAGMENT: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tgsi_exec_get_shader_param(param); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_SHADER_VERTEX: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_SHADER_GEOMETRY: 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (param) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sp_screen->use_llvm) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Softpipe doesn't yet know how to tell draw/llvm about textures */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PIPE_MAX_SAMPLERS; 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sp_screen->use_llvm) 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return draw_get_shader_param(shader, param); 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return draw_get_shader_param_no_llvm(shader, param); 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static float 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)softpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param) 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (param) { 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_MAX_LINE_WIDTH: 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /* fall-through */ 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_MAX_LINE_WIDTH_AA: 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 255.0; /* arbitrary */ 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_MAX_POINT_WIDTH: 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /* fall-through */ 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case PIPE_CAPF_MAX_POINT_WIDTH_AA: 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 255.0; /* arbitrary */ 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 16.0; 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 16.0; /* arbitrary */ 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_GUARD_BAND_LEFT: 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_CAPF_GUARD_BAND_TOP: 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case PIPE_CAPF_GUARD_BAND_RIGHT: 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case PIPE_CAPF_GUARD_BAND_BOTTOM: 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0.0; 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /* should only get here on unhandled cases */ 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) debug_printf("Unexpected PIPE_CAPF %d query\n", param); 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0.0; 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static int 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)softpipe_get_video_param(struct pipe_screen *screen, 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enum pipe_video_profile profile, 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enum pipe_video_cap param) 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (param) { 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_SUPPORTED: 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return vl_profile_supported(screen, profile); 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_NPOT_TEXTURES: 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_MAX_WIDTH: 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_MAX_HEIGHT: 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return vl_video_buffer_max_size(screen); 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_PREFERED_FORMAT: 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PIPE_FORMAT_NV12; 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_PREFERS_INTERLACED: 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE: 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/** 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Query format support for creating a texture, drawing surface, etc. 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * \param format the format to test 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * \param type one of PIPE_TEXTURE, PIPE_SURFACE 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */ 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static boolean 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)softpipe_is_format_supported( struct pipe_screen *screen, 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enum pipe_format format, 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) enum pipe_texture_target target, 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unsigned sample_count, 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unsigned bind) 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles){ 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) struct sw_winsys *winsys = softpipe_screen(screen)->winsys; 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const struct util_format_description *format_desc; 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) assert(target == PIPE_BUFFER || 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target == PIPE_TEXTURE_1D || 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target == PIPE_TEXTURE_1D_ARRAY || 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target == PIPE_TEXTURE_2D || 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target == PIPE_TEXTURE_2D_ARRAY || 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target == PIPE_TEXTURE_RECT || 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) target == PIPE_TEXTURE_3D || 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) target == PIPE_TEXTURE_CUBE); 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) format_desc = util_format_description(format); 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!format_desc) 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return FALSE; 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (sample_count > 1) 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return FALSE; 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (bind & (PIPE_BIND_DISPLAY_TARGET | 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PIPE_BIND_SCANOUT | 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PIPE_BIND_SHARED)) { 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if(!winsys->is_displaytarget_format_supported(winsys, bind, format)) 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return FALSE; 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (bind & PIPE_BIND_RENDER_TARGET) { 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return FALSE; 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /* 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Although possible, it is unnatural to render into compressed or YUV 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * surfaces. So disable these here to avoid going into weird paths 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * inside the state trackers. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (format_desc->block.width != 1 || 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) format_desc->block.height != 1) 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return FALSE; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bind & PIPE_BIND_DEPTH_STENCIL) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FALSE; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * All other operations (sampling, transfer, etc). 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 319 if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 320 return util_format_s3tc_enabled; 321 } 322 323 /* 324 * Everything else should be supported by u_format. 325 */ 326 return TRUE; 327} 328 329 330static void 331softpipe_destroy_screen( struct pipe_screen *screen ) 332{ 333 struct softpipe_screen *sp_screen = softpipe_screen(screen); 334 struct sw_winsys *winsys = sp_screen->winsys; 335 336 if(winsys->destroy) 337 winsys->destroy(winsys); 338 339 FREE(screen); 340} 341 342 343/* This is often overriden by the co-state tracker. 344 */ 345static void 346softpipe_flush_frontbuffer(struct pipe_screen *_screen, 347 struct pipe_resource *resource, 348 unsigned level, unsigned layer, 349 void *context_private) 350{ 351 struct softpipe_screen *screen = softpipe_screen(_screen); 352 struct sw_winsys *winsys = screen->winsys; 353 struct softpipe_resource *texture = softpipe_resource(resource); 354 355 assert(texture->dt); 356 if (texture->dt) 357 winsys->displaytarget_display(winsys, texture->dt, context_private); 358} 359 360static uint64_t 361softpipe_get_timestamp(struct pipe_screen *_screen) 362{ 363 return os_time_get()*1000; 364} 365 366/** 367 * Create a new pipe_screen object 368 * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 369 */ 370struct pipe_screen * 371softpipe_create_screen(struct sw_winsys *winsys) 372{ 373 struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 374 375 if (!screen) 376 return NULL; 377 378 screen->winsys = winsys; 379 380 screen->base.destroy = softpipe_destroy_screen; 381 382 screen->base.get_name = softpipe_get_name; 383 screen->base.get_vendor = softpipe_get_vendor; 384 screen->base.get_param = softpipe_get_param; 385 screen->base.get_shader_param = softpipe_get_shader_param; 386 screen->base.get_paramf = softpipe_get_paramf; 387 screen->base.get_video_param = softpipe_get_video_param; 388 screen->base.get_timestamp = softpipe_get_timestamp; 389 screen->base.is_format_supported = softpipe_is_format_supported; 390 screen->base.is_video_format_supported = vl_video_buffer_is_format_supported; 391 screen->base.context_create = softpipe_create_context; 392 screen->base.flush_frontbuffer = softpipe_flush_frontbuffer; 393 394 screen->use_llvm = debug_get_option_use_llvm(); 395 396 util_format_s3tc_init(); 397 398 softpipe_init_screen_texture_funcs(&screen->base); 399 softpipe_init_screen_fence_funcs(&screen->base); 400 401 return &screen->base; 402} 403