sp_screen.c revision f265a194263bb2a3fa204947a9c98f472835f121
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" 334f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "pipe/p_defines.h" 344f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "pipe/p_screen.h" 35a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri#include "draw/draw_context.h" 36d9ad3aa3b9647f1ede2568600978af956ff32fffChristian König#include "vl/vl_context.h" 374f36cf5858a7e53181c3578685675e15fbfcbb82Brian 3894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell#include "state_tracker/sw_winsys.h" 397b5931b313b8a38fd564435e69e644320fb3de5eJosé Fonseca#include "tgsi/tgsi_exec.h" 4094ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 414f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "sp_texture.h" 42c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell#include "sp_screen.h" 437f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell#include "sp_context.h" 444c5c442f127419d4ea780fbc60bf58f4ed17d71eJosé Fonseca#include "sp_fence.h" 453c57c01a44c294e69d902207b2ec94d28a397a51Keith Whitwell#include "sp_public.h" 464f36cf5858a7e53181c3578685675e15fbfcbb82Brian 474f36cf5858a7e53181c3578685675e15fbfcbb82Brian 484f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char * 494f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_vendor(struct pipe_screen *screen) 504f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 5121a949365d1de2f1fea6cb87c6f389e30156566fJosé Fonseca return "VMware, Inc."; 524f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 534f36cf5858a7e53181c3578685675e15fbfcbb82Brian 544f36cf5858a7e53181c3578685675e15fbfcbb82Brian 554f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char * 564f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_name(struct pipe_screen *screen) 574f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 584f36cf5858a7e53181c3578685675e15fbfcbb82Brian return "softpipe"; 594f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 604f36cf5858a7e53181c3578685675e15fbfcbb82Brian 614f36cf5858a7e53181c3578685675e15fbfcbb82Brian 624f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic int 63e1238b5cad3845c029f60d92c08e810274517d33José Fonsecasoftpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) 644f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 654f36cf5858a7e53181c3578685675e15fbfcbb82Brian switch (param) { 664f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS: 6719aed38919d43179a9f9cb0096aba981fabc4481Brian Paul return PIPE_MAX_SAMPLERS; 687eb8b37735a32768487334664d95e98ad06f48dbBrian case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS: 69e82fddfcd3fe47016863dde3302767f31889d7d5Brian Paul#ifdef HAVE_LLVM 70e82fddfcd3fe47016863dde3302767f31889d7d5Brian Paul /* Softpipe doesn't yet know how to tell draw/llvm about textures */ 71e82fddfcd3fe47016863dde3302767f31889d7d5Brian Paul return 0; 72e82fddfcd3fe47016863dde3302767f31889d7d5Brian Paul#else 738a619e62bffa6f21330df747940e322909937806Michal Krol return PIPE_MAX_VERTEX_SAMPLERS; 74e82fddfcd3fe47016863dde3302767f31889d7d5Brian Paul#endif 758a619e62bffa6f21330df747940e322909937806Michal Krol case PIPE_CAP_MAX_COMBINED_SAMPLERS: 768a619e62bffa6f21330df747940e322909937806Michal Krol return PIPE_MAX_SAMPLERS + PIPE_MAX_VERTEX_SAMPLERS; 774f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_NPOT_TEXTURES: 784f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 794f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_TWO_SIDED_STENCIL: 804f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 814f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_GLSL: 824f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 83c4e89d130f99be0897829c1a1721c63bc07bdbfcJakob Bornecrantz case PIPE_CAP_SM3: 84c4e89d130f99be0897829c1a1721c63bc07bdbfcJakob Bornecrantz return 1; 854f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_ANISOTROPIC_FILTER: 86f4537f99cc83cb8133f66dc97c613e95dc0fe162Andreas Faenger return 1; 874f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_POINT_SPRITE: 884f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 894f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_RENDER_TARGETS: 90fdd794dcfa33482bdabe7c04ec9df655e0c69bfcBrian return PIPE_MAX_COLOR_BUFS; 914f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_OCCLUSION_QUERY: 924f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 93cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich case PIPE_CAP_TIMER_QUERY: 94cdbd5f4203391ee7eb12911bc86fea34dc61c957Mathias Fröhlich return 1; 95be66a8f43172327e3cdde27281e40377cacbb121Brian Paul case PIPE_CAP_TEXTURE_MIRROR_CLAMP: 96be66a8f43172327e3cdde27281e40377cacbb121Brian Paul return 1; 97be66a8f43172327e3cdde27281e40377cacbb121Brian Paul case PIPE_CAP_TEXTURE_MIRROR_REPEAT: 98be66a8f43172327e3cdde27281e40377cacbb121Brian Paul return 1; 994f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_TEXTURE_SHADOW_MAP: 1004f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 1; 10142ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie case PIPE_CAP_TEXTURE_SWIZZLE: 10242ebe3dfd9b0803913e0d932909ca5872d937c20Dave Airlie return 1; 1034f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_2D_LEVELS: 10444eec2802323b1e6cb47dfcf0aeab6b4cfd1c110Brian Paul return SP_MAX_TEXTURE_2D_LEVELS; 1054f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: 10644eec2802323b1e6cb47dfcf0aeab6b4cfd1c110Brian Paul return SP_MAX_TEXTURE_3D_LEVELS; 1074f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS: 10844eec2802323b1e6cb47dfcf0aeab6b4cfd1c110Brian Paul return SP_MAX_TEXTURE_2D_LEVELS; 10954cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin case PIPE_CAP_BLEND_EQUATION_SEPARATE: 11054cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin return 1; 111df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger case PIPE_CAP_INDEP_BLEND_ENABLE: 112df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger return 1; 113df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger case PIPE_CAP_INDEP_BLEND_FUNC: 114df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger return 1; 1156c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: 1166c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT: 1176c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER: 118b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER: 119b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri return 1; 1202c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin case PIPE_CAP_STREAM_OUTPUT: 1212c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin return 1; 12227d3bab05538a6b4cb41dac8334136f824b0e673Brian Paul case PIPE_CAP_PRIMITIVE_RESTART: 12327d3bab05538a6b4cb41dac8334136f824b0e673Brian Paul return 1; 12472c77d472b21276c56778bb24a786737f17bb936Roland Scheidegger case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE: 12572c77d472b21276c56778bb24a786737f17bb936Roland Scheidegger return 0; 126d8f6ef456581644ab9444a1ed23542c2b0fff9e4Dave Airlie case PIPE_CAP_SHADER_STENCIL_EXPORT: 127d8f6ef456581644ab9444a1ed23542c2b0fff9e4Dave Airlie return 1; 12895c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák case PIPE_CAP_TGSI_INSTANCEID: 12995c7881ac8240fa369e33db411bbd165d0f61948Marek Olšák case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: 130cf2184f05717deb860aaaa031fbac48c89865dddBrian Paul return 1; 131779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul case PIPE_CAP_ARRAY_TEXTURES: 132779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul return 1; 1334f36cf5858a7e53181c3578685675e15fbfcbb82Brian default: 1344f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 0; 1354f36cf5858a7e53181c3578685675e15fbfcbb82Brian } 1364f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 1374f36cf5858a7e53181c3578685675e15fbfcbb82Brian 138a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieristatic int 139a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbierisoftpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param) 140a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri{ 141a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri switch(shader) 142a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri { 143a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_FRAGMENT: 144a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri return tgsi_exec_get_shader_param(param); 145a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_VERTEX: 146a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case PIPE_SHADER_GEOMETRY: 147a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri return draw_get_shader_param(shader, param); 148a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri default: 149a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri return 0; 150a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri } 151a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri} 1524f36cf5858a7e53181c3578685675e15fbfcbb82Brian 1534f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic float 154e1238b5cad3845c029f60d92c08e810274517d33José Fonsecasoftpipe_get_paramf(struct pipe_screen *screen, enum pipe_cap param) 1554f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 1564f36cf5858a7e53181c3578685675e15fbfcbb82Brian switch (param) { 1574f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_LINE_WIDTH: 1584f36cf5858a7e53181c3578685675e15fbfcbb82Brian /* fall-through */ 1594f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_LINE_WIDTH_AA: 1604f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 255.0; /* arbitrary */ 1614f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_POINT_WIDTH: 1624f36cf5858a7e53181c3578685675e15fbfcbb82Brian /* fall-through */ 1634f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_POINT_WIDTH_AA: 1644f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 255.0; /* arbitrary */ 1654f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_ANISOTROPY: 166f4537f99cc83cb8133f66dc97c613e95dc0fe162Andreas Faenger return 16.0; 1674f36cf5858a7e53181c3578685675e15fbfcbb82Brian case PIPE_CAP_MAX_TEXTURE_LOD_BIAS: 1684f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 16.0; /* arbitrary */ 1694f36cf5858a7e53181c3578685675e15fbfcbb82Brian default: 1704f36cf5858a7e53181c3578685675e15fbfcbb82Brian return 0; 1714f36cf5858a7e53181c3578685675e15fbfcbb82Brian } 1724f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 1734f36cf5858a7e53181c3578685675e15fbfcbb82Brian 174f265a194263bb2a3fa204947a9c98f472835f121Christian Königstatic int 175f265a194263bb2a3fa204947a9c98f472835f121Christian Königsoftpipe_get_video_param(struct pipe_screen *screen, 176f265a194263bb2a3fa204947a9c98f472835f121Christian König enum pipe_video_profile profile, 177f265a194263bb2a3fa204947a9c98f472835f121Christian König enum pipe_video_cap param) 178f265a194263bb2a3fa204947a9c98f472835f121Christian König{ 179f265a194263bb2a3fa204947a9c98f472835f121Christian König switch (param) { 180f265a194263bb2a3fa204947a9c98f472835f121Christian König case PIPE_VIDEO_CAP_NPOT_TEXTURES: 181f265a194263bb2a3fa204947a9c98f472835f121Christian König return 0; 182f265a194263bb2a3fa204947a9c98f472835f121Christian König default: 183f265a194263bb2a3fa204947a9c98f472835f121Christian König return 0; 184f265a194263bb2a3fa204947a9c98f472835f121Christian König } 185f265a194263bb2a3fa204947a9c98f472835f121Christian König} 1864f36cf5858a7e53181c3578685675e15fbfcbb82Brian 187364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian/** 188364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * Query format support for creating a texture, drawing surface, etc. 189364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param format the format to test 190364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param type one of PIPE_TEXTURE, PIPE_SURFACE 191364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian */ 192364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean 193364f8cad0f8f02fd39d9c51ea0774d349121b58dBriansoftpipe_is_format_supported( struct pipe_screen *screen, 1946c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger enum pipe_format format, 1958aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca enum pipe_texture_target target, 1966c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger unsigned sample_count, 197e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák unsigned bind) 198364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{ 19994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = softpipe_screen(screen)->winsys; 2007e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca const struct util_format_description *format_desc; 20194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 202f57edc58b52605ed3c98f8af91412e3302bbf444Brian Paul assert(target == PIPE_BUFFER || 203f57edc58b52605ed3c98f8af91412e3302bbf444Brian Paul target == PIPE_TEXTURE_1D || 204779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul target == PIPE_TEXTURE_1D_ARRAY || 20530320f0afb3ae4409adab662d65475cf9665bc19Brian Paul target == PIPE_TEXTURE_2D || 206779e9cb658dba4ef44fae7e8aa62409f7227f46cBrian Paul target == PIPE_TEXTURE_2D_ARRAY || 207ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri target == PIPE_TEXTURE_RECT || 20830320f0afb3ae4409adab662d65475cf9665bc19Brian Paul target == PIPE_TEXTURE_3D || 20930320f0afb3ae4409adab662d65475cf9665bc19Brian Paul target == PIPE_TEXTURE_CUBE); 21030320f0afb3ae4409adab662d65475cf9665bc19Brian Paul 2117e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca format_desc = util_format_description(format); 2127e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (!format_desc) 2137e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 2147e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 2156c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger if (sample_count > 1) 2166c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger return FALSE; 2176c32670706e8ed3855ff2187f0eadee43b5b8742Roland Scheidegger 2187e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (bind & (PIPE_BIND_DISPLAY_TARGET | 2197e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca PIPE_BIND_SCANOUT | 2207e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca PIPE_BIND_SHARED)) { 2217e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if(!winsys->is_displaytarget_format_supported(winsys, bind, format)) 2221a4383cd4283fc48f8b70a2692ef5a545b6ab58cBrian Paul return FALSE; 2237e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca } 22447e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 2257e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (bind & PIPE_BIND_RENDER_TARGET) { 2267e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) 2277e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 22847e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 2297e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 2307e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * Although possible, it is unnatural to render into compressed or YUV 2317e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * surfaces. So disable these here to avoid going into weird paths 2327e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * inside the state trackers. 2337e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca */ 2347e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->block.width != 1 || 2357e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca format_desc->block.height != 1) 2367e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 23747e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca } 23847e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 2397e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (bind & PIPE_BIND_DEPTH_STENCIL) { 2407e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 24194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell return FALSE; 2427e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 2437e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 2447e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * TODO: Unfortunately we cannot render into anything more than 32 bits 2457e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * because we encode depth and stencil clear values into a 32bit word. 2467e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca */ 2477e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->block.bits > 32) 2487e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 2497e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 2507e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 2517e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * TODO: eliminate this restriction 2527e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca */ 2537e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format == PIPE_FORMAT_Z32_FLOAT) 2547e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return FALSE; 2557e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca } 2567e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 2577e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 2587e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * All other operations (sampling, transfer, etc). 2597e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca */ 2607e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca 2617e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) { 2627e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca return util_format_s3tc_enabled; 26394ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell } 26494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 2657e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca /* 2667e4ce65d714624d5d2888c59f0d83ffda0662834José Fonseca * Everything else should be supported by u_format. 26747e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca */ 26894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell return TRUE; 269364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian} 270364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian 271364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian 2724f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic void 2734f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_destroy_screen( struct pipe_screen *screen ) 2744f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 27594ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct softpipe_screen *sp_screen = softpipe_screen(screen); 27694ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = sp_screen->winsys; 2779dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca 2789dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca if(winsys->destroy) 2799dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca winsys->destroy(winsys); 2809dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca 2814f36cf5858a7e53181c3578685675e15fbfcbb82Brian FREE(screen); 2824f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 2834f36cf5858a7e53181c3578685675e15fbfcbb82Brian 2844f36cf5858a7e53181c3578685675e15fbfcbb82Brian 28594ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell/* This is often overriden by the co-state tracker. 28694ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell */ 28794ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwellstatic void 28894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwellsoftpipe_flush_frontbuffer(struct pipe_screen *_screen, 2894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct pipe_resource *resource, 2904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned level, unsigned layer, 29194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell void *context_private) 29294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell{ 29394ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct softpipe_screen *screen = softpipe_screen(_screen); 29494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = screen->winsys; 2954c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger struct softpipe_resource *texture = softpipe_resource(resource); 29694ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell 29794ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell assert(texture->dt); 29894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell if (texture->dt) 29994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell winsys->displaytarget_display(winsys, texture->dt, context_private); 30094ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell} 301c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell 302a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian Königstatic struct pipe_video_context * 303d9ad3aa3b9647f1ede2568600978af956ff32fffChristian Königsp_video_create(struct pipe_screen *screen, void *priv) 304a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König{ 305a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König struct pipe_context *pipe; 306a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König 307a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König assert(screen); 308a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König 309a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König pipe = screen->context_create(screen, NULL); 310a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König if (!pipe) 311a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König return NULL; 312a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König 313a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König /* TODO: Use slice buffering for softpipe when implemented, no advantage to buffering an entire picture with softpipe */ 314f265a194263bb2a3fa204947a9c98f472835f121Christian König return vl_create_context(pipe); 315a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König} 316a1fecd09c2c5fdba3da5c38fce567b5bd2e6053dChristian König 3174f36cf5858a7e53181c3578685675e15fbfcbb82Brian/** 3184f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Create a new pipe_screen object 3194f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Note: we're not presently subclassing pipe_screen (no softpipe_screen). 3204f36cf5858a7e53181c3578685675e15fbfcbb82Brian */ 3214f36cf5858a7e53181c3578685675e15fbfcbb82Brianstruct pipe_screen * 32294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwellsoftpipe_create_screen(struct sw_winsys *winsys) 3234f36cf5858a7e53181c3578685675e15fbfcbb82Brian{ 324c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen); 3254f36cf5858a7e53181c3578685675e15fbfcbb82Brian 3264f36cf5858a7e53181c3578685675e15fbfcbb82Brian if (!screen) 3274f36cf5858a7e53181c3578685675e15fbfcbb82Brian return NULL; 3284f36cf5858a7e53181c3578685675e15fbfcbb82Brian 32994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell screen->winsys = winsys; 3304f36cf5858a7e53181c3578685675e15fbfcbb82Brian 33194ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell screen->base.winsys = NULL; 332c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.destroy = softpipe_destroy_screen; 3334f36cf5858a7e53181c3578685675e15fbfcbb82Brian 334c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_name = softpipe_get_name; 335c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_vendor = softpipe_get_vendor; 336c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_param = softpipe_get_param; 337a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri screen->base.get_shader_param = softpipe_get_shader_param; 338c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.get_paramf = softpipe_get_paramf; 339f265a194263bb2a3fa204947a9c98f472835f121Christian König screen->base.get_video_param = softpipe_get_video_param; 340c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell screen->base.is_format_supported = softpipe_is_format_supported; 3417f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell screen->base.context_create = softpipe_create_context; 34294ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell screen->base.flush_frontbuffer = softpipe_flush_frontbuffer; 3430a51e8633287b97b4d88e0cb553854535f2fa5e7Younes Manton screen->base.video_context_create = sp_video_create; 3444f36cf5858a7e53181c3578685675e15fbfcbb82Brian 34547e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca util_format_s3tc_init(); 34647e61426586bb9f9f40950e9c4372e4f12bb9ed6José Fonseca 347c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell softpipe_init_screen_texture_funcs(&screen->base); 3484c5c442f127419d4ea780fbc60bf58f4ed17d71eJosé Fonseca softpipe_init_screen_fence_funcs(&screen->base); 3494f36cf5858a7e53181c3578685675e15fbfcbb82Brian 350c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell return &screen->base; 3514f36cf5858a7e53181c3578685675e15fbfcbb82Brian} 352