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