sp_screen.c revision 6bb415f862fec94b82915f806beb3a7427bd4bb8
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"
31adfbba476db1fc55006efb748656ebb1a481d143Zack Rusin#include "pipe/internal/p_winsys_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"
384f36cf5858a7e53181c3578685675e15fbfcbb82Brian
394f36cf5858a7e53181c3578685675e15fbfcbb82Brian
404f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char *
414f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_vendor(struct pipe_screen *screen)
424f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
4321a949365d1de2f1fea6cb87c6f389e30156566fJosé Fonseca   return "VMware, Inc.";
444f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
454f36cf5858a7e53181c3578685675e15fbfcbb82Brian
464f36cf5858a7e53181c3578685675e15fbfcbb82Brian
474f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic const char *
484f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_name(struct pipe_screen *screen)
494f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
504f36cf5858a7e53181c3578685675e15fbfcbb82Brian   return "softpipe";
514f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
524f36cf5858a7e53181c3578685675e15fbfcbb82Brian
534f36cf5858a7e53181c3578685675e15fbfcbb82Brian
544f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic int
554f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_param(struct pipe_screen *screen, int param)
564f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
574f36cf5858a7e53181c3578685675e15fbfcbb82Brian   switch (param) {
584f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
5919aed38919d43179a9f9cb0096aba981fabc4481Brian Paul      return PIPE_MAX_SAMPLERS;
607eb8b37735a32768487334664d95e98ad06f48dbBrian   case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
618a619e62bffa6f21330df747940e322909937806Michal Krol      return PIPE_MAX_VERTEX_SAMPLERS;
628a619e62bffa6f21330df747940e322909937806Michal Krol   case PIPE_CAP_MAX_COMBINED_SAMPLERS:
638a619e62bffa6f21330df747940e322909937806Michal Krol      return PIPE_MAX_SAMPLERS + PIPE_MAX_VERTEX_SAMPLERS;
644f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_NPOT_TEXTURES:
654f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
664f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_TWO_SIDED_STENCIL:
674f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
684f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_GLSL:
694f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
704f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_ANISOTROPIC_FILTER:
714f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
724f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_POINT_SPRITE:
734f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
744f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_RENDER_TARGETS:
75fdd794dcfa33482bdabe7c04ec9df655e0c69bfcBrian      return PIPE_MAX_COLOR_BUFS;
764f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_OCCLUSION_QUERY:
774f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
78be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
79be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      return 1;
80be66a8f43172327e3cdde27281e40377cacbb121Brian Paul   case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
81be66a8f43172327e3cdde27281e40377cacbb121Brian Paul      return 1;
824f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_TEXTURE_SHADOW_MAP:
834f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
844f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
85fa0ca31586f2523ac65dbf9c1fdca99dfbca7456Brian Paul      return 13; /* max 4Kx4K */
864f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
871730b8db1237485778abdc4ae37e122414b5423bVinson Lee      return 9;  /* max 256x256x256 */
884f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
89fa0ca31586f2523ac65dbf9c1fdca99dfbca7456Brian Paul      return 13; /* max 4Kx4K */
90af7fb892d8f1eff1f0e787bf8c7d65165e3aa51eBrian Paul   case PIPE_CAP_TGSI_CONT_SUPPORTED:
91af7fb892d8f1eff1f0e787bf8c7d65165e3aa51eBrian Paul      return 1;
9254cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin   case PIPE_CAP_BLEND_EQUATION_SEPARATE:
9354cf63278ff28eb03503f649c46bf24437a1cbf8Patrice Mandin      return 1;
944f36cf5858a7e53181c3578685675e15fbfcbb82Brian   default:
954f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
964f36cf5858a7e53181c3578685675e15fbfcbb82Brian   }
974f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
984f36cf5858a7e53181c3578685675e15fbfcbb82Brian
994f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1004f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic float
1014f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_paramf(struct pipe_screen *screen, int param)
1024f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
1034f36cf5858a7e53181c3578685675e15fbfcbb82Brian   switch (param) {
1044f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_LINE_WIDTH:
1054f36cf5858a7e53181c3578685675e15fbfcbb82Brian      /* fall-through */
1064f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_LINE_WIDTH_AA:
1074f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 255.0; /* arbitrary */
1084f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_POINT_WIDTH:
1094f36cf5858a7e53181c3578685675e15fbfcbb82Brian      /* fall-through */
1104f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_POINT_WIDTH_AA:
1114f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 255.0; /* arbitrary */
1124f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
113f9c0ce0e073cd60f632de3a0588a111b92a602ddBrian Paul      return 16.0; /* not actually signficant at this time */
1144f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
1154f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 16.0; /* arbitrary */
1164f36cf5858a7e53181c3578685675e15fbfcbb82Brian   default:
1174f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
1184f36cf5858a7e53181c3578685675e15fbfcbb82Brian   }
1194f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1204f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1214f36cf5858a7e53181c3578685675e15fbfcbb82Brian
122364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian/**
123364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * Query format support for creating a texture, drawing surface, etc.
124364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param format  the format to test
125364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param type  one of PIPE_TEXTURE, PIPE_SURFACE
126364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian */
127364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean
128364f8cad0f8f02fd39d9c51ea0774d349121b58dBriansoftpipe_is_format_supported( struct pipe_screen *screen,
1298aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              enum pipe_format format,
1308aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              enum pipe_texture_target target,
1318aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              unsigned tex_usage,
1328aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              unsigned geom_flags )
133364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{
13430320f0afb3ae4409adab662d65475cf9665bc19Brian Paul   assert(target == PIPE_TEXTURE_1D ||
13530320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_2D ||
13630320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_3D ||
13730320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_CUBE);
13830320f0afb3ae4409adab662d65475cf9665bc19Brian Paul
1398aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   switch(format) {
140a0fbc01ceaef08b33f97936d8840a6f48ec1654dMichal Krol   case PIPE_FORMAT_L16_UNORM:
141a0fbc01ceaef08b33f97936d8840a6f48ec1654dMichal Krol   case PIPE_FORMAT_YCBCR_REV:
142a0fbc01ceaef08b33f97936d8840a6f48ec1654dMichal Krol   case PIPE_FORMAT_YCBCR:
1438aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT1_RGB:
1448aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT1_RGBA:
1458aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT3_RGBA:
1468aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT5_RGBA:
147ec48396e0fefb86a549b02b760f669f74c15d715Michal Krol   case PIPE_FORMAT_Z32_FLOAT:
1480f884ed993500171ad91fc9f2552574face9ee17Michal Krol   case PIPE_FORMAT_R8G8_SNORM:
1490f884ed993500171ad91fc9f2552574face9ee17Michal Krol   case PIPE_FORMAT_B6UG5SR5S_NORM:
1500f884ed993500171ad91fc9f2552574face9ee17Michal Krol   case PIPE_FORMAT_X8UB8UG8SR8S_NORM:
1510f884ed993500171ad91fc9f2552574face9ee17Michal Krol   case PIPE_FORMAT_A8B8G8R8_SNORM:
1526bb415f862fec94b82915f806beb3a7427bd4bb8Keith Whitwell   case PIPE_FORMAT_NONE:
153364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      return FALSE;
1548aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   default:
1558aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca      return TRUE;
156364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   }
157364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian}
158364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
159364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
1604f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic void
1614f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_destroy_screen( struct pipe_screen *screen )
1624f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
1639dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca   struct pipe_winsys *winsys = screen->winsys;
1649dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
1659dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca   if(winsys->destroy)
1669dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca      winsys->destroy(winsys);
1679dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
1684f36cf5858a7e53181c3578685675e15fbfcbb82Brian   FREE(screen);
1694f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1704f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1714f36cf5858a7e53181c3578685675e15fbfcbb82Brian
172c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell
1734f36cf5858a7e53181c3578685675e15fbfcbb82Brian/**
1744f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Create a new pipe_screen object
1754f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Note: we're not presently subclassing pipe_screen (no softpipe_screen).
1764f36cf5858a7e53181c3578685675e15fbfcbb82Brian */
1774f36cf5858a7e53181c3578685675e15fbfcbb82Brianstruct pipe_screen *
1784f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_create_screen(struct pipe_winsys *winsys)
1794f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
180c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen);
1814f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1824f36cf5858a7e53181c3578685675e15fbfcbb82Brian   if (!screen)
1834f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return NULL;
1844f36cf5858a7e53181c3578685675e15fbfcbb82Brian
185c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.winsys = winsys;
1864f36cf5858a7e53181c3578685675e15fbfcbb82Brian
187c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.destroy = softpipe_destroy_screen;
1884f36cf5858a7e53181c3578685675e15fbfcbb82Brian
189c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_name = softpipe_get_name;
190c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_vendor = softpipe_get_vendor;
191c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_param = softpipe_get_param;
192c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_paramf = softpipe_get_paramf;
193c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.is_format_supported = softpipe_is_format_supported;
1944f36cf5858a7e53181c3578685675e15fbfcbb82Brian
195c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   softpipe_init_screen_texture_funcs(&screen->base);
196969c728095e9a18036989f85610390c55ae61d5eZack Rusin   u_simple_screen_init(&screen->base);
1974f36cf5858a7e53181c3578685675e15fbfcbb82Brian
198c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   return &screen->base;
1994f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
200