sp_screen.c revision b7b07b0029c4c17603c97467dda0a487417c2477
14f36cf5858a7e53181c3578685675e15fbfcbb82Brian/**************************************************************************
24f36cf5858a7e53181c3578685675e15fbfcbb82Brian *
34f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
44f36cf5858a7e53181c3578685675e15fbfcbb82Brian * All Rights Reserved.
54f36cf5858a7e53181c3578685675e15fbfcbb82Brian *
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:
134f36cf5858a7e53181c3578685675e15fbfcbb82Brian *
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.
174f36cf5858a7e53181c3578685675e15fbfcbb82Brian *
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.
254f36cf5858a7e53181c3578685675e15fbfcbb82Brian *
264f36cf5858a7e53181c3578685675e15fbfcbb82Brian **************************************************************************/
274f36cf5858a7e53181c3578685675e15fbfcbb82Brian
284f36cf5858a7e53181c3578685675e15fbfcbb82Brian
294f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
30969c728095e9a18036989f85610390c55ae61d5eZack Rusin#include "util/u_simple_screen.h"
3125357696c3f253d44e83798e2a7e7f1f60c5adc5José Fonseca#include "util/u_simple_screen.h"
324f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "pipe/p_defines.h"
334f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "pipe/p_screen.h"
344f36cf5858a7e53181c3578685675e15fbfcbb82Brian
354f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "sp_texture.h"
364f36cf5858a7e53181c3578685675e15fbfcbb82Brian#include "sp_winsys.h"
37c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell#include "sp_screen.h"
387f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell#include "sp_context.h"
394f36cf5858a7e53181c3578685675e15fbfcbb82Brian
404f36cf5858a7e53181c3578685675e15fbfcbb82Brian
414f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char *
424f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_vendor(struct pipe_screen *screen)
434f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
4421a949365d1de2f1fea6cb87c6f389e30156566fJosé Fonseca   return "VMware, Inc.";
454f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
464f36cf5858a7e53181c3578685675e15fbfcbb82Brian
474f36cf5858a7e53181c3578685675e15fbfcbb82Brian
484f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char *
494f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_name(struct pipe_screen *screen)
504f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
514f36cf5858a7e53181c3578685675e15fbfcbb82Brian   return "softpipe";
524f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
534f36cf5858a7e53181c3578685675e15fbfcbb82Brian
544f36cf5858a7e53181c3578685675e15fbfcbb82Brian
554f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic int
564f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_param(struct pipe_screen *screen, int param)
574f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
584f36cf5858a7e53181c3578685675e15fbfcbb82Brian   switch (param) {
594f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
6019aed38919d43179a9f9cb0096aba981fabc4481Brian Paul      return PIPE_MAX_SAMPLERS;
617eb8b37735a32768487334664d95e98ad06f48dbBrian   case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
628a619e62bffa6f21330df747940e322909937806Michal Krol      return PIPE_MAX_VERTEX_SAMPLERS;
638a619e62bffa6f21330df747940e322909937806Michal Krol   case PIPE_CAP_MAX_COMBINED_SAMPLERS:
648a619e62bffa6f21330df747940e322909937806Michal Krol      return PIPE_MAX_SAMPLERS + PIPE_MAX_VERTEX_SAMPLERS;
654f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_NPOT_TEXTURES:
664f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
674f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_TWO_SIDED_STENCIL:
684f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
694f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_GLSL:
704f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
714f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_ANISOTROPIC_FILTER:
724f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
734f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_POINT_SPRITE:
744f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
754f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_RENDER_TARGETS:
76fdd794dcfa33482bdabe7c04ec9df655e0c69bfcBrian      return PIPE_MAX_COLOR_BUFS;
774f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_OCCLUSION_QUERY:
784f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
79be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
80be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      return 1;
81be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
82be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      return 1;
834f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_TEXTURE_SHADOW_MAP:
844f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
854f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
86fa0ca31586f2523ac65dbf9c1fdca99dfbca7456Brian Paul      return 13; /* max 4Kx4K */
874f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
881730b8db1237485778abdc4ae37e122414b5423bVinson Lee      return 9;  /* max 256x256x256 */
894f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
90fa0ca31586f2523ac65dbf9c1fdca99dfbca7456Brian Paul      return 13; /* max 4Kx4K */
91af7fb892d8f1eff1f0e787bf8c7d65165e3aa51eBrian Paul   case PIPE_CAP_TGSI_CONT_SUPPORTED:
92af7fb892d8f1eff1f0e787bf8c7d65165e3aa51eBrian Paul      return 1;
9354cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin   case PIPE_CAP_BLEND_EQUATION_SEPARATE:
9454cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin      return 1;
953320acb67dfa9330a80ab38e0c164f5d9c0a074aMichal Krol   case PIPE_CAP_MAX_CONST_BUFFERS:
963320acb67dfa9330a80ab38e0c164f5d9c0a074aMichal Krol      return PIPE_MAX_CONSTANT_BUFFERS;
973320acb67dfa9330a80ab38e0c164f5d9c0a074aMichal Krol   case PIPE_CAP_MAX_CONST_BUFFER_SIZE:
983320acb67dfa9330a80ab38e0c164f5d9c0a074aMichal Krol      return 4096 * 4 * sizeof(float);
99df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger   case PIPE_CAP_INDEP_BLEND_ENABLE:
100df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger      return 1;
101df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger   case PIPE_CAP_INDEP_BLEND_FUNC:
102df4395198ce433251c8bd2d497543c7b389e5acaRoland Scheidegger      return 1;
1036c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
1046c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
1056c403750d6515f8b2f333d995c87676016e1883dLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
106b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
107b2299d80b4278b8b6553d4e4da4d40d37881d76eLuca Barbieri      return 1;
1084f36cf5858a7e53181c3578685675e15fbfcbb82Brian   default:
1094f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
1104f36cf5858a7e53181c3578685675e15fbfcbb82Brian   }
1114f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1124f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1134f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1144f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic float
1154f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_paramf(struct pipe_screen *screen, int param)
1164f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
1174f36cf5858a7e53181c3578685675e15fbfcbb82Brian   switch (param) {
1184f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_LINE_WIDTH:
1194f36cf5858a7e53181c3578685675e15fbfcbb82Brian      /* fall-through */
1204f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_LINE_WIDTH_AA:
1214f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 255.0; /* arbitrary */
1224f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_POINT_WIDTH:
1234f36cf5858a7e53181c3578685675e15fbfcbb82Brian      /* fall-through */
1244f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_POINT_WIDTH_AA:
1254f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 255.0; /* arbitrary */
1264f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
127f9c0ce0e073cd60f632de3a0588a111b92a602ddBrian Paul      return 16.0; /* not actually signficant at this time */
1284f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
1294f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 16.0; /* arbitrary */
1304f36cf5858a7e53181c3578685675e15fbfcbb82Brian   default:
1314f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
1324f36cf5858a7e53181c3578685675e15fbfcbb82Brian   }
1334f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1344f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1354f36cf5858a7e53181c3578685675e15fbfcbb82Brian
136364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian/**
137364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * Query format support for creating a texture, drawing surface, etc.
138364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param format  the format to test
139364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param type  one of PIPE_TEXTURE, PIPE_SURFACE
140364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian */
141364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean
142364f8cad0f8f02fd39d9c51ea0774d349121b58dBriansoftpipe_is_format_supported( struct pipe_screen *screen,
1438aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              enum pipe_format format,
1448aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              enum pipe_texture_target target,
1458aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              unsigned tex_usage,
1468aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              unsigned geom_flags )
147364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{
14830320f0afb3ae4409adab662d65475cf9665bc19Brian Paul   assert(target == PIPE_TEXTURE_1D ||
14930320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_2D ||
15030320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_3D ||
15130320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_CUBE);
15230320f0afb3ae4409adab662d65475cf9665bc19Brian Paul
1538aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   switch(format) {
154a0fbc01ceaef08b33f97936d8840a6f48ec1654dMichal Krol   case PIPE_FORMAT_L16_UNORM:
155b7b07b0029c4c17603c97467dda0a487417c2477José Fonseca   case PIPE_FORMAT_YUYV:
156b7b07b0029c4c17603c97467dda0a487417c2477José Fonseca   case PIPE_FORMAT_UYVY:
1578aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT1_RGB:
1588aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT1_RGBA:
1598aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT3_RGBA:
1608aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT5_RGBA:
161ec48396e0fefb86a549b02b760f669f74c15d715Michal Krol   case PIPE_FORMAT_Z32_FLOAT:
1620f884ed993500171ad91fc9f2552574face9ee17Michal Krol   case PIPE_FORMAT_R8G8_SNORM:
163b7b07b0029c4c17603c97467dda0a487417c2477José Fonseca   case PIPE_FORMAT_R5SG5SB6U_NORM:
164b7b07b0029c4c17603c97467dda0a487417c2477José Fonseca   case PIPE_FORMAT_R8SG8SB8UX8U_NORM:
165971ab386c0c8b7fd261a41e9a38fc4f83f9ba3f6José Fonseca   case PIPE_FORMAT_R8G8B8A8_SNORM:
1666bb415f862fec94b82915f806beb3a7427bd4bb8Keith Whitwell   case PIPE_FORMAT_NONE:
167364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      return FALSE;
1688aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   default:
1698aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca      return TRUE;
170364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   }
171364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian}
172364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
173364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
1744f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic void
1754f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_destroy_screen( struct pipe_screen *screen )
1764f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
1779dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca   struct pipe_winsys *winsys = screen->winsys;
1789dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
1799dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca   if(winsys->destroy)
1809dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca      winsys->destroy(winsys);
1819dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
1824f36cf5858a7e53181c3578685675e15fbfcbb82Brian   FREE(screen);
1834f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1844f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1854f36cf5858a7e53181c3578685675e15fbfcbb82Brian
186c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell
1874f36cf5858a7e53181c3578685675e15fbfcbb82Brian/**
1884f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Create a new pipe_screen object
1894f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Note: we're not presently subclassing pipe_screen (no softpipe_screen).
1904f36cf5858a7e53181c3578685675e15fbfcbb82Brian */
1914f36cf5858a7e53181c3578685675e15fbfcbb82Brianstruct pipe_screen *
1924f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_create_screen(struct pipe_winsys *winsys)
1934f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
194c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen);
1954f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1964f36cf5858a7e53181c3578685675e15fbfcbb82Brian   if (!screen)
1974f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return NULL;
1984f36cf5858a7e53181c3578685675e15fbfcbb82Brian
199c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.winsys = winsys;
2004f36cf5858a7e53181c3578685675e15fbfcbb82Brian
201c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.destroy = softpipe_destroy_screen;
2024f36cf5858a7e53181c3578685675e15fbfcbb82Brian
203c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_name = softpipe_get_name;
204c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_vendor = softpipe_get_vendor;
205c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_param = softpipe_get_param;
206c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_paramf = softpipe_get_paramf;
207c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.is_format_supported = softpipe_is_format_supported;
2087f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell   screen->base.context_create = softpipe_create_context;
2094f36cf5858a7e53181c3578685675e15fbfcbb82Brian
210c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   softpipe_init_screen_texture_funcs(&screen->base);
211969c728095e9a18036989f85610390c55ae61d5eZack Rusin   u_simple_screen_init(&screen->base);
2124f36cf5858a7e53181c3578685675e15fbfcbb82Brian
213c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   return &screen->base;
2144f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
215