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