14f36cf5858a7e53181c3578685675e15fbfcbb82Brian/************************************************************************** 2a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König * 34f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 44f36cf5858a7e53181c3578685675e15fbfcbb82Brian * All Rights Reserved. 5a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König * 64f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Permission is hereby granted, free of charge, to any person obtaining a 74f36cf5858a7e53181c3578685675e15fbfcbb82Brian * copy of this software and associated documentation files (the 84f36cf5858a7e53181c3578685675e15fbfcbb82Brian * "Software"), to deal in the Software without restriction, including 94f36cf5858a7e53181c3578685675e15fbfcbb82Brian * without limitation the rights to use, copy, modify, merge, publish, 104f36cf5858a7e53181c3578685675e15fbfcbb82Brian * distribute, sub license, and/or sell copies of the Software, and to 114f36cf5858a7e53181c3578685675e15fbfcbb82Brian * permit persons to whom the Software is furnished to do so, subject to 124f36cf5858a7e53181c3578685675e15fbfcbb82Brian * the following conditions: 13a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König * 144f36cf5858a7e53181c3578685675e15fbfcbb82Brian * The above copyright notice and this permission notice (including the 154f36cf5858a7e53181c3578685675e15fbfcbb82Brian * next paragraph) shall be included in all copies or substantial portions 164f36cf5858a7e53181c3578685675e15fbfcbb82Brian * of the Software. 17a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König * 184f36cf5858a7e53181c3578685675e15fbfcbb82Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 194f36cf5858a7e53181c3578685675e15fbfcbb82Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 204f36cf5858a7e53181c3578685675e15fbfcbb82Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 214f36cf5858a7e53181c3578685675e15fbfcbb82Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 224f36cf5858a7e53181c3578685675e15fbfcbb82Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 234f36cf5858a7e53181c3578685675e15fbfcbb82Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 244f36cf5858a7e53181c3578685675e15fbfcbb82Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König * 264f36cf5858a7e53181c3578685675e15fbfcbb82Brian **************************************************************************/ 274f36cf5858a7e53181c3578685675e15fbfcbb82Brian 284f36cf5858a7e53181c3578685675e15fbfcbb82Brian 294f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 307e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca#include "util/u_format.h" 31f45d43a17fa1f4de50e1cf3e54d3edfdff91399dJosé Fonseca#include "util/u_format_s3tc.h" 32a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König#include "util/u_video.h" 335ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák#include "os/os_time.h" 344f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "pipe/p_defines.h" 354f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "pipe/p_screen.h" 36a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri#include "draw/draw_context.h" 37efc7fda4627919b5355952d955ee4a2c98505e56Christian König#include "vl/vl_decoder.h" 387eca76952b6726be9459375dde7478a01789577eChristian König#include "vl/vl_video_buffer.h" 394f36cf5858a7e53181c3578685675e15fbfcbb82Brian 4094ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell#include "state_tracker/sw_winsys.h" 417b5931b313b8a38fd564435e69e644320fb3de5eJosé Fonseca#include "tgsi/tgsi_exec.h" 4294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 434f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "sp_texture.h" 44c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell#include "sp_screen.h" 457f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell#include "sp_context.h" 464c5c442f127419d4ea780fbc60bf58f4ed17d71eJosé Fonseca#include "sp_fence.h" 473c57c01a44c294e69d902207b2ec94d28a397a51Keith Whitwell#include "sp_public.h" 484f36cf5858a7e53181c3578685675e15fbfcbb82Brian 490c57323de8bcfb5932e14a88ef9554059fc3be72Brian PaulDEBUG_GET_ONCE_BOOL_OPTION(use_llvm, "SOFTPIPE_USE_LLVM", FALSE) 504f36cf5858a7e53181c3578685675e15fbfcbb82Brian 514f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char * 524f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_vendor(struct pipe_screen *screen) 534f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 5421a949365d1de2f1fea6cb87c6f389e30156566fJosé Fonseca return "VMware, Inc."; 554f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 564f36cf5858a7e53181c3578685675e15fbfcbb82Brian 574f36cf5858a7e53181c3578685675e15fbfcbb82Brian 584f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char * 594f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_name(struct pipe_screen *screen) 604f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 614f36cf5858a7e53181c3578685675e15fbfcbb82Brian return "softpipe"; 624f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 634f36cf5858a7e53181c3578685675e15fbfcbb82Brian 644f36cf5858a7e53181c3578685675e15fbfcbb82Brian 654f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic int 66e1238b5cad3845c029f60d92c08e810274517d33José Fonsecasoftpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) 674f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 684f36cf5858a7e53181c3578685675e15fbfcbb82Brian switch (param) { 698a619e62bffa6f21330df747940e322909937806Michal Krol case PIPE_CAP_MAX_COMBINED_SAMPLERS: 70cab2fed135bc1edf7b65ddca3236020638427061Brian Paul return 2 * PIPE_MAX_SAMPLERS; /* VS + FS */ 714f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_NPOT_TEXTURES: 724f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 734f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_TWO_SIDED_STENCIL: 744f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 75c4e89d130f99be0897829c1a1721c63bc07bdbfcJakob Bornecrantz case PIPE_CAP_SM3: 76c4e89d130f99be0897829c1a1721c63bc07bdbfcJakob Bornecrantz return 1; 774f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_ANISOTROPIC_FILTER: 78f4537f99cc83cb8133f66dc97c613e95dc0fe162Andreas Faenger return 1; 794f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_POINT_SPRITE: 804f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 814f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_RENDER_TARGETS: 82fdd794dcfa33482bdabe7c04ec9df655e0c69bfcBrian return PIPE_MAX_COLOR_BUFS; 830d29fb017bce0968240ae875af4b3702c2cd46efDave Airlie case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: 844b1c3b920ee921506948fc14a0b70c746a811c2fDave Airlie return 1; 854f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_OCCLUSION_QUERY: 864f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 87cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich case PIPE_CAP_TIMER_QUERY: 88cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich return 1; 89be66a8f43172327e3cdde27281e40377cacbb121Brian Paul case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 90be66a8f43172327e3cdde27281e40377cacbb121Brian Paul return 1; 914f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_TEXTURE_SHADOW_MAP: 924f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 9342ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie case PIPE_CAP_TEXTURE_SWIZZLE: 9442ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie return 1; 954f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 9644eec2802323b1e6cb47dfcf0aeab6b4cfd1c110Brian Paul return SP_MAX_TEXTURE_2D_LEVELS; 974f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 9844eec2802323b1e6cb47dfcf0aeab6b4cfd1c110Brian Paul return SP_MAX_TEXTURE_3D_LEVELS; 994f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 1002cbccfdcb09322f5711cff995f9a2953af355d35Brian Paul return SP_MAX_TEXTURE_CUBE_LEVELS; 10154cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin case PIPE_CAP_BLEND_EQUATION_SEPARATE: 10254cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin return 1; 103df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger case PIPE_CAP_INDEP_BLEND_ENABLE: 104df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger return 1; 105df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger case PIPE_CAP_INDEP_BLEND_FUNC: 106df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger return 1; 1076c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 1086c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 1096c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 110b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 111b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri return 1; 1127d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_DEPTH_CLIP_DISABLE: 1137d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 114861a029ddb31e91bb4d8e18ab708d0d172f63aadMarek Olšák case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: 115ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie return PIPE_MAX_SO_BUFFERS; 116ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS: 117ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS: 118ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie return 16*4; 11927d3bab05538a6b4cb41dac8334136f824b0e673Brian Paul case PIPE_CAP_PRIMITIVE_RESTART: 12027d3bab05538a6b4cb41dac8334136f824b0e673Brian Paul return 1; 12172c77d472b21276c56778bb24a786737f17bb936Roland Scheidegger case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE: 12272c77d472b21276c56778bb24a786737f17bb936Roland Scheidegger return 0; 123d8f6ef456581644ab9444a1ed23542c2b0fff9e4Dave Airlie case PIPE_CAP_SHADER_STENCIL_EXPORT: 124d8f6ef456581644ab9444a1ed23542c2b0fff9e4Dave Airlie return 1; 12595c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák case PIPE_CAP_TGSI_INSTANCEID: 12695c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 127cf2184f05717deb860aaaa031fbac48c89865dddBrian Paul return 1; 1287d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_SEAMLESS_CUBE_MAP: 1297d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE: 1307d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 1317d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_SCALED_RESOLVE: 1327d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 133379429137238e79296b8222c0e13d7d961910633Marek Olšák case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: 13416b5fda0328abb65f0bf245e28e85b753984e0c3Dave Airlie return 256; /* for GL3 */ 1350b666106c5f75b581ef1ebeb354c29a00400404fDave Airlie case PIPE_CAP_MIN_TEXEL_OFFSET: 1360b666106c5f75b581ef1ebeb354c29a00400404fDave Airlie return -8; 1370b666106c5f75b581ef1ebeb354c29a00400404fDave Airlie case PIPE_CAP_MAX_TEXEL_OFFSET: 1380b666106c5f75b581ef1ebeb354c29a00400404fDave Airlie return 7; 1393d13b081c72626acba6b9a25baec740c60dfafe1Marek Olšák case PIPE_CAP_CONDITIONAL_RENDER: 1403d13b081c72626acba6b9a25baec740c60dfafe1Marek Olšák return 1; 1417d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_TEXTURE_BARRIER: 1427d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 143bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case PIPE_CAP_FRAGMENT_COLOR_CLAMPED: 144bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case PIPE_CAP_VERTEX_COLOR_UNCLAMPED: /* draw module */ 145bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case PIPE_CAP_VERTEX_COLOR_CLAMPED: /* draw module */ 1460fe2b397bbee346f72f48f364a78459e5a54c534Dave Airlie return 1; 1477d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: 1487d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 149171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák case PIPE_CAP_GLSL_FEATURE_LEVEL: 150171be755223d99f8cc5cc1bdaf8bd7b4caa04b4fMarek Olšák return 130; 1518b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: 1528b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller return 0; 1537d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_COMPUTE: 1547d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 155978c1aa1d0f6fd9a188762a8534de33fc63eeea0Marek Olšák case PIPE_CAP_USER_VERTEX_BUFFERS: 156437ab1d6df7282770ee869180446db36c2dbdfa8Marek Olšák case PIPE_CAP_USER_INDEX_BUFFERS: 157437ab1d6df7282770ee869180446db36c2dbdfa8Marek Olšák case PIPE_CAP_USER_CONSTANT_BUFFERS: 158978c1aa1d0f6fd9a188762a8534de33fc63eeea0Marek Olšák return 1; 1591b749dc34f8d83cf3dfa863279b1fe2b356d34b2Marek Olšák case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT: 1601b749dc34f8d83cf3dfa863279b1fe2b356d34b2Marek Olšák return 16; 1617d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: 1627d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS: 1637d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: 1647d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY: 1657d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY: 1667d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY: 1677d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAP_START_INSTANCE: 1684f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 0; 1695ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák case PIPE_CAP_QUERY_TIMESTAMP: 1705ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák return 1; 1714f36cf5858a7e53181c3578685675e15fbfcbb82Brian } 1727d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul /* should only get here on unhandled cases */ 1737d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul debug_printf("Unexpected PIPE_CAP %d query\n", param); 1747d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0; 1754f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 1764f36cf5858a7e53181c3578685675e15fbfcbb82Brian 177a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieristatic int 178a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbierisoftpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) 179a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri{ 18002932f37fa030f2d438b599106651cb938c3edc9Dave Airlie struct softpipe_screen *sp_screen = softpipe_screen(screen); 181a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri switch(shader) 182a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri { 183a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_FRAGMENT: 184a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri return tgsi_exec_get_shader_param(param); 185a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_VERTEX: 186a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_GEOMETRY: 187f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák switch (param) { 188f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 18902932f37fa030f2d438b599106651cb938c3edc9Dave Airlie if (sp_screen->use_llvm) 19002932f37fa030f2d438b599106651cb938c3edc9Dave Airlie /* Softpipe doesn't yet know how to tell draw/llvm about textures */ 19102932f37fa030f2d438b599106651cb938c3edc9Dave Airlie return 0; 1926dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca else 193cab2fed135bc1edf7b65ddca3236020638427061Brian Paul return PIPE_MAX_SAMPLERS; 194f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák default: 1956dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca if (sp_screen->use_llvm) 1966dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return draw_get_shader_param(shader, param); 1976dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca else 1986dddd184803da5f67f69e7c243dbb596b4dd4b9dJosé Fonseca return draw_get_shader_param_no_llvm(shader, param); 199f5bfe54a34d9c8cd5de2b096d0e8486fe0d990a7Marek Olšák } 200a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri default: 201a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri return 0; 202a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri } 203a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri} 2044f36cf5858a7e53181c3578685675e15fbfcbb82Brian 2054f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic float 206bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšáksoftpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param) 2074f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 2084f36cf5858a7e53181c3578685675e15fbfcbb82Brian switch (param) { 209bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák case PIPE_CAPF_MAX_LINE_WIDTH: 2104f36cf5858a7e53181c3578685675e15fbfcbb82Brian /* fall-through */ 211bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák case PIPE_CAPF_MAX_LINE_WIDTH_AA: 2124f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 255.0; /* arbitrary */ 213bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák case PIPE_CAPF_MAX_POINT_WIDTH: 2144f36cf5858a7e53181c3578685675e15fbfcbb82Brian /* fall-through */ 215bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák case PIPE_CAPF_MAX_POINT_WIDTH_AA: 2164f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 255.0; /* arbitrary */ 217bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY: 218f4537f99cc83cb8133f66dc97c613e95dc0fe162Andreas Faenger return 16.0; 219bb71f9249a66b9a4921a878766c0a2d87624c369Marek Olšák case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS: 2204f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 16.0; /* arbitrary */ 2217d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAPF_GUARD_BAND_LEFT: 2227d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAPF_GUARD_BAND_TOP: 2237d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAPF_GUARD_BAND_RIGHT: 2247d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul case PIPE_CAPF_GUARD_BAND_BOTTOM: 2257d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0.0; 2264f36cf5858a7e53181c3578685675e15fbfcbb82Brian } 2277d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul /* should only get here on unhandled cases */ 2287d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul debug_printf("Unexpected PIPE_CAPF %d query\n", param); 2297d23dcdaccaabece42adf82ef6cddbfc85582b63Brian Paul return 0.0; 2304f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 2314f36cf5858a7e53181c3578685675e15fbfcbb82Brian 232f265a194263bb2a3fa204947a9c98f472835f121Christian Königstatic int 233f265a194263bb2a3fa204947a9c98f472835f121Christian Königsoftpipe_get_video_param(struct pipe_screen *screen, 234f265a194263bb2a3fa204947a9c98f472835f121Christian König enum pipe_video_profile profile, 235f265a194263bb2a3fa204947a9c98f472835f121Christian König enum pipe_video_cap param) 236f265a194263bb2a3fa204947a9c98f472835f121Christian König{ 237f265a194263bb2a3fa204947a9c98f472835f121Christian König switch (param) { 238efc7fda4627919b5355952d955ee4a2c98505e56Christian König case PIPE_VIDEO_CAP_SUPPORTED: 239efc7fda4627919b5355952d955ee4a2c98505e56Christian König return vl_profile_supported(screen, profile); 240f265a194263bb2a3fa204947a9c98f472835f121Christian König case PIPE_VIDEO_CAP_NPOT_TEXTURES: 241f265a194263bb2a3fa204947a9c98f472835f121Christian König return 0; 242efc7fda4627919b5355952d955ee4a2c98505e56Christian König case PIPE_VIDEO_CAP_MAX_WIDTH: 243efc7fda4627919b5355952d955ee4a2c98505e56Christian König case PIPE_VIDEO_CAP_MAX_HEIGHT: 244efc7fda4627919b5355952d955ee4a2c98505e56Christian König return vl_video_buffer_max_size(screen); 2459d9afcb5bac2931d4b8e6d1aa571e941c5110c90Christian König case PIPE_VIDEO_CAP_PREFERED_FORMAT: 2469d9afcb5bac2931d4b8e6d1aa571e941c5110c90Christian König return PIPE_FORMAT_NV12; 247f3f03c67e90f962f67e7b58b7c7baff3be251cb1Christian König case PIPE_VIDEO_CAP_PREFERS_INTERLACED: 248f3f03c67e90f962f67e7b58b7c7baff3be251cb1Christian König return false; 249f3f03c67e90f962f67e7b58b7c7baff3be251cb1Christian König case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: 250f3f03c67e90f962f67e7b58b7c7baff3be251cb1Christian König return false; 251f3f03c67e90f962f67e7b58b7c7baff3be251cb1Christian König case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE: 252f3f03c67e90f962f67e7b58b7c7baff3be251cb1Christian König return true; 253f265a194263bb2a3fa204947a9c98f472835f121Christian König default: 254f265a194263bb2a3fa204947a9c98f472835f121Christian König return 0; 255f265a194263bb2a3fa204947a9c98f472835f121Christian König } 256f265a194263bb2a3fa204947a9c98f472835f121Christian König} 2574f36cf5858a7e53181c3578685675e15fbfcbb82Brian 258364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian/** 259364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * Query format support for creating a texture, drawing surface, etc. 260364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param format the format to test 261364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param type one of PIPE_TEXTURE, PIPE_SURFACE 262364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian */ 263364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean 264364f8cad0f8f02fd39d9c51ea0774d349121b58dBriansoftpipe_is_format_supported( struct pipe_screen *screen, 2656c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger enum pipe_format format, 2668aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca enum pipe_texture_target target, 2676c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger unsigned sample_count, 268e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák unsigned bind) 269364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{ 27094ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = softpipe_screen(screen)->winsys; 2717e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca const struct util_format_description *format_desc; 27294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 273f57edc58b52605ed3c98f8af91412e3302bbf444Brian Paul assert(target == PIPE_BUFFER || 274f57edc58b52605ed3c98f8af91412e3302bbf444Brian Paul target == PIPE_TEXTURE_1D || 275779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul target == PIPE_TEXTURE_1D_ARRAY || 27630320f0afb3ae4409adab662d65475cf9665bc19Brian Paul target == PIPE_TEXTURE_2D || 277779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul target == PIPE_TEXTURE_2D_ARRAY || 278ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri target == PIPE_TEXTURE_RECT || 27930320f0afb3ae4409adab662d65475cf9665bc19Brian Paul target == PIPE_TEXTURE_3D || 28030320f0afb3ae4409adab662d65475cf9665bc19Brian Paul target == PIPE_TEXTURE_CUBE); 28130320f0afb3ae4409adab662d65475cf9665bc19Brian Paul 2827e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca format_desc = util_format_description(format); 2837e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (!format_desc) 2847e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 2857e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 2866c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger if (sample_count > 1) 2876c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger return FALSE; 2886c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger 2897e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (bind & (PIPE_BIND_DISPLAY_TARGET | 2907e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca PIPE_BIND_SCANOUT | 2917e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca PIPE_BIND_SHARED)) { 2927e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if(!winsys->is_displaytarget_format_supported(winsys, bind, format)) 2931a4383cd4283fc48f8b70a2692ef5a545b6ab58cBrian Paul return FALSE; 2947e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca } 29547e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 2967e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (bind & PIPE_BIND_RENDER_TARGET) { 2977e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) 2987e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 29947e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 3007e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 3017e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * Although possible, it is unnatural to render into compressed or YUV 3027e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * surfaces. So disable these here to avoid going into weird paths 3037e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * inside the state trackers. 3047e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca */ 3057e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->block.width != 1 || 3067e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca format_desc->block.height != 1) 3077e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 30847e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca } 30947e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 3107e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (bind & PIPE_BIND_DEPTH_STENCIL) { 3117e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 31294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell return FALSE; 3137e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca } 3147e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 3157e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 3167e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * All other operations (sampling, transfer, etc). 3177e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca */ 3187e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 3197e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 3207e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return util_format_s3tc_enabled; 32194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell } 32294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 3237e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 3247e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * Everything else should be supported by u_format. 32547e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca */ 32694ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell return TRUE; 327364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian} 328364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian 329364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian 3304f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic void 3314f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_destroy_screen( struct pipe_screen *screen ) 3324f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 33394ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct softpipe_screen *sp_screen = softpipe_screen(screen); 33494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = sp_screen->winsys; 3359dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca 3369dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca if(winsys->destroy) 3379dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca winsys->destroy(winsys); 3389dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca 3394f36cf5858a7e53181c3578685675e15fbfcbb82Brian FREE(screen); 3404f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 3414f36cf5858a7e53181c3578685675e15fbfcbb82Brian 3424f36cf5858a7e53181c3578685675e15fbfcbb82Brian 34394ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell/* This is often overriden by the co-state tracker. 34494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell */ 34594ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwellstatic void 34694ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwellsoftpipe_flush_frontbuffer(struct pipe_screen *_screen, 3474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_resource *resource, 3484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, unsigned layer, 34994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell void *context_private) 35094ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell{ 35194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct softpipe_screen *screen = softpipe_screen(_screen); 35294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = screen->winsys; 3534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct softpipe_resource *texture = softpipe_resource(resource); 35494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 35594ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell assert(texture->dt); 35694ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell if (texture->dt) 35794ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell winsys->displaytarget_display(winsys, texture->dt, context_private); 35894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell} 359c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell 3605ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšákstatic uint64_t 3615ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšáksoftpipe_get_timestamp(struct pipe_screen *_screen) 3625ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák{ 3635ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák return os_time_get()*1000; 3645ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák} 3655ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák 3664f36cf5858a7e53181c3578685675e15fbfcbb82Brian/** 3674f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Create a new pipe_screen object 3684f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 3694f36cf5858a7e53181c3578685675e15fbfcbb82Brian */ 3704f36cf5858a7e53181c3578685675e15fbfcbb82Brianstruct pipe_screen * 37194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwellsoftpipe_create_screen(struct sw_winsys *winsys) 3724f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 373c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 3744f36cf5858a7e53181c3578685675e15fbfcbb82Brian 3754f36cf5858a7e53181c3578685675e15fbfcbb82Brian if (!screen) 3764f36cf5858a7e53181c3578685675e15fbfcbb82Brian return NULL; 3774f36cf5858a7e53181c3578685675e15fbfcbb82Brian 37894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell screen->winsys = winsys; 3794f36cf5858a7e53181c3578685675e15fbfcbb82Brian 380c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.destroy = softpipe_destroy_screen; 3814f36cf5858a7e53181c3578685675e15fbfcbb82Brian 382c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_name = softpipe_get_name; 383c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_vendor = softpipe_get_vendor; 384c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_param = softpipe_get_param; 385a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri screen->base.get_shader_param = softpipe_get_shader_param; 386c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_paramf = softpipe_get_paramf; 387f265a194263bb2a3fa204947a9c98f472835f121Christian König screen->base.get_video_param = softpipe_get_video_param; 3885ddcda060ce19d0e63b18142bffa49709e103cc8Marek Olšák screen->base.get_timestamp = softpipe_get_timestamp; 389c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.is_format_supported = softpipe_is_format_supported; 3907eca76952b6726be9459375dde7478a01789577eChristian König screen->base.is_video_format_supported = vl_video_buffer_is_format_supported; 3917f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell screen->base.context_create = softpipe_create_context; 39294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell screen->base.flush_frontbuffer = softpipe_flush_frontbuffer; 3934f36cf5858a7e53181c3578685675e15fbfcbb82Brian 3945840ec2d41d09895bec7074a90521978fb933695Dave Airlie screen->use_llvm = debug_get_option_use_llvm(); 39502932f37fa030f2d438b599106651cb938c3edc9Dave Airlie 39647e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca util_format_s3tc_init(); 39747e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 398c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell softpipe_init_screen_texture_funcs(&screen->base); 3994c5c442f127419d4ea780fbc60bf58f4ed17d71eJosé Fonseca softpipe_init_screen_fence_funcs(&screen->base); 4004f36cf5858a7e53181c3578685675e15fbfcbb82Brian 401c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell return &screen->base; 4024f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 403