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