sp_screen.c revision f9c0ce0e073cd60f632de3a0588a111b92a602dd
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{
434f36cf5858a7e53181c3578685675e15fbfcbb82Brian   return "Tungsten Graphics, 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:
6119aed38919d43179a9f9cb0096aba981fabc4481Brian Paul      return PIPE_MAX_SAMPLERS;
624f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_NPOT_TEXTURES:
634f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
644f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_TWO_SIDED_STENCIL:
654f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
664f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_GLSL:
674f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 1;
684f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_S3TC:
694f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
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:
874f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 8;  /* max 128x128x128 */
884f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
89fa0ca31586f2523ac65dbf9c1fdca99dfbca7456Brian Paul      return 13; /* max 4Kx4K */
904f36cf5858a7e53181c3578685675e15fbfcbb82Brian   default:
914f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
924f36cf5858a7e53181c3578685675e15fbfcbb82Brian   }
934f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
944f36cf5858a7e53181c3578685675e15fbfcbb82Brian
954f36cf5858a7e53181c3578685675e15fbfcbb82Brian
964f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic float
974f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_get_paramf(struct pipe_screen *screen, int param)
984f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
994f36cf5858a7e53181c3578685675e15fbfcbb82Brian   switch (param) {
1004f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_LINE_WIDTH:
1014f36cf5858a7e53181c3578685675e15fbfcbb82Brian      /* fall-through */
1024f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_LINE_WIDTH_AA:
1034f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 255.0; /* arbitrary */
1044f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_POINT_WIDTH:
1054f36cf5858a7e53181c3578685675e15fbfcbb82Brian      /* fall-through */
1064f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_POINT_WIDTH_AA:
1074f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 255.0; /* arbitrary */
1084f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
109f9c0ce0e073cd60f632de3a0588a111b92a602ddBrian Paul      return 16.0; /* not actually signficant at this time */
1104f36cf5858a7e53181c3578685675e15fbfcbb82Brian   case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
1114f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 16.0; /* arbitrary */
1124f36cf5858a7e53181c3578685675e15fbfcbb82Brian   default:
1134f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return 0;
1144f36cf5858a7e53181c3578685675e15fbfcbb82Brian   }
1154f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1164f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1174f36cf5858a7e53181c3578685675e15fbfcbb82Brian
118364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian/**
119364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * Query format support for creating a texture, drawing surface, etc.
120364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param format  the format to test
121364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian * \param type  one of PIPE_TEXTURE, PIPE_SURFACE
122364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian */
123364f8cad0f8f02fd39d9c51ea0774d349121b58dBrianstatic boolean
124364f8cad0f8f02fd39d9c51ea0774d349121b58dBriansoftpipe_is_format_supported( struct pipe_screen *screen,
1258aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              enum pipe_format format,
1268aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              enum pipe_texture_target target,
1278aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              unsigned tex_usage,
1288aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca                              unsigned geom_flags )
129364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian{
13030320f0afb3ae4409adab662d65475cf9665bc19Brian Paul   assert(target == PIPE_TEXTURE_1D ||
13130320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_2D ||
13230320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_3D ||
13330320f0afb3ae4409adab662d65475cf9665bc19Brian Paul          target == PIPE_TEXTURE_CUBE);
13430320f0afb3ae4409adab662d65475cf9665bc19Brian Paul
1358aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   switch(format) {
1368aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT1_RGB:
1378aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT1_RGBA:
1388aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT3_RGBA:
1398aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   case PIPE_FORMAT_DXT5_RGBA:
140364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian      return FALSE;
1418aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca   default:
1428aafc03b260ab8923f1b373f7effa75bcdb40a72José Fonseca      return TRUE;
143364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian   }
144364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian}
145364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
146364f8cad0f8f02fd39d9c51ea0774d349121b58dBrian
1474f36cf5858a7e53181c3578685675e15fbfcbb82Brianstatic void
1484f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_destroy_screen( struct pipe_screen *screen )
1494f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
1509dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca   struct pipe_winsys *winsys = screen->winsys;
1519dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
1529dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca   if(winsys->destroy)
1539dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca      winsys->destroy(winsys);
1549dcb956a0618931c97693f7c74493cf296cfe86cJosé Fonseca
1554f36cf5858a7e53181c3578685675e15fbfcbb82Brian   FREE(screen);
1564f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
1574f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1584f36cf5858a7e53181c3578685675e15fbfcbb82Brian
159c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell
1604f36cf5858a7e53181c3578685675e15fbfcbb82Brian/**
1614f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Create a new pipe_screen object
1624f36cf5858a7e53181c3578685675e15fbfcbb82Brian * Note: we're not presently subclassing pipe_screen (no softpipe_screen).
1634f36cf5858a7e53181c3578685675e15fbfcbb82Brian */
1644f36cf5858a7e53181c3578685675e15fbfcbb82Brianstruct pipe_screen *
1654f36cf5858a7e53181c3578685675e15fbfcbb82Briansoftpipe_create_screen(struct pipe_winsys *winsys)
1664f36cf5858a7e53181c3578685675e15fbfcbb82Brian{
167c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   struct softpipe_screen *screen = CALLOC_STRUCT(softpipe_screen);
1684f36cf5858a7e53181c3578685675e15fbfcbb82Brian
1694f36cf5858a7e53181c3578685675e15fbfcbb82Brian   if (!screen)
1704f36cf5858a7e53181c3578685675e15fbfcbb82Brian      return NULL;
1714f36cf5858a7e53181c3578685675e15fbfcbb82Brian
172c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.winsys = winsys;
1734f36cf5858a7e53181c3578685675e15fbfcbb82Brian
174c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.destroy = softpipe_destroy_screen;
1754f36cf5858a7e53181c3578685675e15fbfcbb82Brian
176c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_name = softpipe_get_name;
177c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_vendor = softpipe_get_vendor;
178c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_param = softpipe_get_param;
179c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.get_paramf = softpipe_get_paramf;
180c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   screen->base.is_format_supported = softpipe_is_format_supported;
1814f36cf5858a7e53181c3578685675e15fbfcbb82Brian
182c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   softpipe_init_screen_texture_funcs(&screen->base);
183969c728095e9a18036989f85610390c55ae61d5eZack Rusin   u_simple_screen_init(&screen->base);
1844f36cf5858a7e53181c3578685675e15fbfcbb82Brian
185c9ed86a96483063f3d6789ed16645a3dca77d726Keith Whitwell   return &screen->base;
1864f36cf5858a7e53181c3578685675e15fbfcbb82Brian}
187