1110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz/************************************************************************** 2110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * 3110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * Copyright 2010 Vmware, Inc. 4110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * All Rights Reserved. 5110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * 6110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person obtaining a 7110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * copy of this software and associated documentation files (the 8110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * "Software"), to deal in the Software without restriction, including 9110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * without limitation the rights to use, copy, modify, merge, publish, 10110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * distribute, sub license, and/or sell copies of the Software, and to 11110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * permit persons to whom the Software is furnished to do so, subject to 12110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * the following conditions: 13110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * 14110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * The above copyright notice and this permission notice (including the 15110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * next paragraph) shall be included in all copies or substantial portions 16110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * of the Software. 17110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * 18110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz * 26110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz **************************************************************************/ 27110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 28110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz#include "pipe/p_screen.h" 29110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz#include "util/u_format.h" 30110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz#include "util/u_debug.h" 31110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz#include "u_caps.h" 32110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 33f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/** 34f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * Iterates over a list of caps checks as defined in u_caps.h. Should 35f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * all checks pass returns TRUE and out is set to the last element of 36f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * the list (TERMINATE). Should any check fail returns FALSE and set 37f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * out to the index of the start of the first failing check. 38f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz */ 39110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzboolean 40f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantzutil_check_caps_out(struct pipe_screen *screen, const unsigned *list, int *out) 41110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz{ 42110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz int i, tmpi; 43110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz float tmpf; 44110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 45110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz for (i = 0; list[i];) { 46110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz switch(list[i++]) { 47110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_CAP: 48110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz if (!screen->get_param(screen, list[i++])) { 49f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz *out = i - 2; 50110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return FALSE; 51110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 52110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 53110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_INT: 54110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz tmpi = screen->get_param(screen, list[i++]); 55110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz if (tmpi < (int)list[i++]) { 56f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz *out = i - 3; 57110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return FALSE; 58110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 59110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 60110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_FLOAT: 61110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz tmpf = screen->get_paramf(screen, list[i++]); 62110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz if (tmpf < (float)list[i++]) { 63f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz *out = i - 3; 64110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return FALSE; 65110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 66110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 67110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_FORMAT: 68110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz if (!screen->is_format_supported(screen, 69110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i++], 70110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz PIPE_TEXTURE_2D, 71815b75705f5e3f0f7db025368da37bb14395de9aRoland Scheidegger 0, 72e968975cb57eb854769292f7c6ff773c64a386c3Marek Olšák PIPE_BIND_SAMPLER_VIEW)) { 73f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz *out = i - 2; 74110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return FALSE; 75110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 76f86def5e74566c8db1ced1cddfc1a1f7bee9875dJakob Bornecrantz break; 77a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri case UTIL_CAPS_CHECK_SHADER: 78a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri tmpi = screen->get_shader_param(screen, list[i] >> 24, list[i] & ((1 << 24) - 1)); 79a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri ++i; 80a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri if (tmpi < (int)list[i++]) { 81a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri *out = i - 3; 82a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri return FALSE; 83a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri } 84ccb5e65bc972e0065c0b71cdf0d2feecb6cc95abLuca Barbieri break; 85f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz case UTIL_CAPS_CHECK_UNIMPLEMENTED: 86f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz *out = i - 1; 87f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz return FALSE; 88110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz default: 89110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz assert(!"Unsupported check"); 90110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return FALSE; 91110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 92110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 93f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz 94f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz *out = i; 95110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return TRUE; 96110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz} 97110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 98f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/** 99f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * Iterates over a list of caps checks as defined in u_caps.h. 100f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * Returns TRUE if all caps checks pass returns FALSE otherwise. 101f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz */ 102110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzboolean 103f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantzutil_check_caps(struct pipe_screen *screen, const unsigned *list) 104110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz{ 105110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz int out; 106110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz return util_check_caps_out(screen, list, &out); 107110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz} 108110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 109f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz 110f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/* 111f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * Below follows some demo lists. 112f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * 113f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * None of these lists are exhausting lists of what is 114f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * actually needed to support said API and more here for 115f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * as example on how to uses the above functions. Especially 116f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * for DX10 and DX11 where Gallium is missing features. 117f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz */ 118f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz 119110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz/* DX 9_1 */ 120110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzstatic unsigned caps_dx_9_1[] = { 121110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_RENDER_TARGETS, 1), 122110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 12), /* 2048 */ 123110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9), /* 256 */ 124110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */ 125110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_FLOAT(MAX_TEXTURE_ANISOTROPY, 2), 126110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_TERMINATE 127110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz}; 128110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 129110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz/* DX 9_2 */ 130110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzstatic unsigned caps_dx_9_2[] = { 131110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(OCCLUSION_QUERY), 132110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(BLEND_EQUATION_SEPARATE), 133110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_RENDER_TARGETS, 1), 134110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 12), /* 2048 */ 135110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9), /* 256 */ 136110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */ 137110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_FLOAT(MAX_TEXTURE_ANISOTROPY, 16), 138110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_TERMINATE 139110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz}; 140110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 141110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz/* DX 9_3 */ 142110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzstatic unsigned caps_dx_9_3[] = { 143110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(SM3), 144110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz //UTIL_CHECK_CAP(INSTANCING), 145110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(OCCLUSION_QUERY), 146110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_RENDER_TARGETS, 4), 147110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 13), /* 4096 */ 148110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9), /* 256 */ 149110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */ 150110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_FLOAT(MAX_TEXTURE_ANISOTROPY, 16), 151110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_TERMINATE 152110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz}; 153110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 154110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz/* DX 10 */ 155110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzstatic unsigned caps_dx_10[] = { 156110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(SM3), 157110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz //UTIL_CHECK_CAP(INSTANCING), 158110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(OCCLUSION_QUERY), 159110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_RENDER_TARGETS, 8), 160110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 14), /* 8192 */ 161110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 12), /* 2048 */ 162110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 14), /* 8192 */ 163110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_FLOAT(MAX_TEXTURE_ANISOTROPY, 16), 164f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz UTIL_CHECK_UNIMPLEMENTED, /* XXX Unimplemented features in Gallium */ 165110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_TERMINATE 166110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz}; 167110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 168f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/* DX11 */ 169110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzstatic unsigned caps_dx_11[] = { 170110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(SM3), 171110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz //UTIL_CHECK_CAP(INSTANCING), 172110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(OCCLUSION_QUERY), 173110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_RENDER_TARGETS, 8), 174110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 14), /* 16384 */ 175110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 12), /* 2048 */ 176110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 14), /* 16384 */ 177110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_FLOAT(MAX_TEXTURE_ANISOTROPY, 16), 178110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_FORMAT(B8G8R8A8_UNORM), 179f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz UTIL_CHECK_UNIMPLEMENTED, /* XXX Unimplemented features in Gallium */ 180110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_TERMINATE 181110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz}; 182110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 183110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz/* OpenGL 2.1 */ 184110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantzstatic unsigned caps_opengl_2_1[] = { 185110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(OCCLUSION_QUERY), 186110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(TWO_SIDED_STENCIL), 187110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_CAP(BLEND_EQUATION_SEPARATE), 188f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz UTIL_CHECK_INT(MAX_RENDER_TARGETS, 2), 189110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz UTIL_CHECK_TERMINATE 190110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz}; 191110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 192f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/* OpenGL 3.0 */ 193f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/* UTIL_CHECK_INT(MAX_RENDER_TARGETS, 8), */ 194f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz 195e54164b4e3890e3eddc4ae976e3cc2f1fa2f441bCorbin Simpson/* Shader Model 3 */ 196e54164b4e3890e3eddc4ae976e3cc2f1fa2f441bCorbin Simpsonstatic unsigned caps_sm3[] = { 197a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(FRAGMENT, MAX_INSTRUCTIONS, 512), 198a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(FRAGMENT, MAX_INPUTS, 10), 199a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(FRAGMENT, MAX_TEMPS, 32), 200a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(FRAGMENT, MAX_ADDRS, 1), 201a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(FRAGMENT, MAX_CONSTS, 224), 202a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri 203a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(VERTEX, MAX_INSTRUCTIONS, 512), 204a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(VERTEX, MAX_INPUTS, 16), 205a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(VERTEX, MAX_TEMPS, 32), 206a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(VERTEX, MAX_ADDRS, 2), 207a508d2dddcc67d0f92cc36b9ed6f36a9bbfc579dLuca Barbieri UTIL_CHECK_SHADER(VERTEX, MAX_CONSTS, 256), 208e54164b4e3890e3eddc4ae976e3cc2f1fa2f441bCorbin Simpson 209e54164b4e3890e3eddc4ae976e3cc2f1fa2f441bCorbin Simpson UTIL_CHECK_TERMINATE 210e54164b4e3890e3eddc4ae976e3cc2f1fa2f441bCorbin Simpson}; 211f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz 212f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/** 213f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz * Demo function which checks against theoretical caps needed for different APIs. 214f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz */ 215f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantzvoid util_caps_demo_print(struct pipe_screen *screen) 216110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz{ 217110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz struct { 218110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz char* name; 219110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz unsigned *list; 220110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } list[] = { 221110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {"DX 9.1", caps_dx_9_1}, 222110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {"DX 9.2", caps_dx_9_2}, 223110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {"DX 9.3", caps_dx_9_3}, 224110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {"DX 10", caps_dx_10}, 225110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {"DX 11", caps_dx_11}, 226110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {"OpenGL 2.1", caps_opengl_2_1}, 227f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz/* {"OpenGL 3.0", caps_opengl_3_0},*/ 228e54164b4e3890e3eddc4ae976e3cc2f1fa2f441bCorbin Simpson {"SM3", caps_sm3}, 229110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz {NULL, NULL} 230110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz }; 231110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz int i, out = 0; 232110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz 233110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz for (i = 0; list[i].name; i++) { 234110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz if (util_check_caps_out(screen, list[i].list, &out)) { 235f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz debug_printf("%s: %s yes\n", __FUNCTION__, list[i].name); 236110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz continue; 237110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 238110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz switch (list[i].list[out]) { 239110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_CAP: 240f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz debug_printf("%s: %s no (cap %u not supported)\n", __FUNCTION__, 241110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].name, 242110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].list[out + 1]); 243110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 244110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_INT: 245f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz debug_printf("%s: %s no (cap %u less then %u)\n", __FUNCTION__, 246110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].name, 247110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].list[out + 1], 248110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].list[out + 2]); 249110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 250110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_FLOAT: 251f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz debug_printf("%s: %s no (cap %u less then %f)\n", __FUNCTION__, 252110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].name, 253110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].list[out + 1], 254f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz (double)(int)list[i].list[out + 2]); 255110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 256110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz case UTIL_CAPS_CHECK_FORMAT: 257f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz debug_printf("%s: %s no (format %s not supported)\n", __FUNCTION__, 258110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz list[i].name, 259110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz util_format_name(list[i].list[out + 1]) + 12); 260110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz break; 261f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz case UTIL_CAPS_CHECK_UNIMPLEMENTED: 262f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz debug_printf("%s: %s no (not implemented in gallium or state tracker)\n", 263f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz __FUNCTION__, list[i].name); 264f7cf8b4658aadb0a125f1e1fb9d6cb73d44902b0Jakob Bornecrantz break; 265110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz default: 266110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz assert(!"Unsupported check"); 267110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 268110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz } 269110a956a645f900e100062fbbe19c5835f9b5476Jakob Bornecrantz} 270