1a1287f549a3e6527b8cf3bf5b5f563ba63c6f48cBrian Paul 2b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/************************************************************************** 3b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 4b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 5b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Copyright 2012 Marek Olšák <maraeo@gmail.com> 6b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * All Rights Reserved. 7b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 8b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a 9b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * copy of this software and associated documentation files (the 10b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * "Software"), to deal in the Software without restriction, including 11b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * without limitation the rights to use, copy, modify, merge, publish, 12b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * distribute, sub license, and/or sell copies of the Software, and to 13b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * permit persons to whom the Software is furnished to do so, subject to 14b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * the following conditions: 15b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 16b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * The above copyright notice and this permission notice (including the 17b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * next paragraph) shall be included in all copies or substantial portions 18b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * of the Software. 19b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 20b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 23b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * IN NO EVENT SHALL AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 24b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 28b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák **************************************************************************/ 29b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 30b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/* 31b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * This converts the VBO's vertex attribute/array information into 32b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Gallium vertex state and binds it. 33b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 34b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Authors: 35b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Keith Whitwell <keith@tungstengraphics.com> 36b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Marek Olšák <maraeo@gmail.com> 37b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 38b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 39b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "st_context.h" 40b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "st_atom.h" 41b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "st_cb_bufferobjects.h" 42b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "st_draw.h" 43b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "st_program.h" 44b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 45b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "cso_cache/cso_context.h" 46b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "util/u_math.h" 47b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 48b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák#include "main/bufferobj.h" 49a1287f549a3e6527b8cf3bf5b5f563ba63c6f48cBrian Paul#include "main/glformats.h" 50b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 51b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 52b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint double_types[4] = { 53b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64_FLOAT, 54b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64G64_FLOAT, 55b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64G64B64_FLOAT, 56b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64G64B64A64_FLOAT 57b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 58b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 59b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint float_types[4] = { 60b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_FLOAT, 61b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_FLOAT, 62b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_FLOAT, 63b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_FLOAT 64b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 65b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 66b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint half_float_types[4] = { 67b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_FLOAT, 68b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_FLOAT, 69b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_FLOAT, 70b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_FLOAT 71b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 72b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 73b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint uint_types_norm[4] = { 74b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_UNORM, 75b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_UNORM, 76b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_UNORM, 77b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_UNORM 78b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 79b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 80b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint uint_types_scale[4] = { 81b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_USCALED, 82b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_USCALED, 83b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_USCALED, 84b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_USCALED 85b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 86b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 87b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint uint_types_int[4] = { 88b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_UINT, 89b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_UINT, 90b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_UINT, 91b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_UINT 92b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 93b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 94b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint int_types_norm[4] = { 95b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_SNORM, 96b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_SNORM, 97b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_SNORM, 98b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_SNORM 99b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 100b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 101b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint int_types_scale[4] = { 102b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_SSCALED, 103b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_SSCALED, 104b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_SSCALED, 105b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_SSCALED 106b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 107b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 108b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint int_types_int[4] = { 109b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_SINT, 110b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_SINT, 111b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_SINT, 112b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_SINT 113b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 114b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 115b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ushort_types_norm[4] = { 116b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_UNORM, 117b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_UNORM, 118b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_UNORM, 119b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_UNORM 120b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 121b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 122b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ushort_types_scale[4] = { 123b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_USCALED, 124b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_USCALED, 125b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_USCALED, 126b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_USCALED 127b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 128b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 129b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ushort_types_int[4] = { 130b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_UINT, 131b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_UINT, 132b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_UINT, 133b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_UINT 134b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 135b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 136b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint short_types_norm[4] = { 137b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_SNORM, 138b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_SNORM, 139b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_SNORM, 140b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_SNORM 141b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 142b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 143b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint short_types_scale[4] = { 144b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_SSCALED, 145b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_SSCALED, 146b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_SSCALED, 147b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_SSCALED 148b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 149b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 150b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint short_types_int[4] = { 151b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_SINT, 152b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_SINT, 153b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_SINT, 154b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_SINT 155b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 156b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 157b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ubyte_types_norm[4] = { 158b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_UNORM, 159b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_UNORM, 160b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_UNORM, 161b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_UNORM 162b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 163b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 164b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ubyte_types_scale[4] = { 165b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_USCALED, 166b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_USCALED, 167b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_USCALED, 168b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_USCALED 169b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 170b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 171b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ubyte_types_int[4] = { 172b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_UINT, 173b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_UINT, 174b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_UINT, 175b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_UINT 176b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 177b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 178b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint byte_types_norm[4] = { 179b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_SNORM, 180b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_SNORM, 181b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_SNORM, 182b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_SNORM 183b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 184b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 185b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint byte_types_scale[4] = { 186b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_SSCALED, 187b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_SSCALED, 188b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_SSCALED, 189b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_SSCALED 190b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 191b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 192b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint byte_types_int[4] = { 193b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_SINT, 194b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_SINT, 195b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_SINT, 196b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_SINT 197b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 198b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 199b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint fixed_types[4] = { 200b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_FIXED, 201b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_FIXED, 202b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_FIXED, 203b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_FIXED 204b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 205b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 206b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 207b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 208b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Return a PIPE_FORMAT_x for the given GL datatype and size. 209b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 210b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákenum pipe_format 211b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákst_pipe_vertex_format(GLenum type, GLuint size, GLenum format, 212b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLboolean normalized, GLboolean integer) 213b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 214b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert((type >= GL_BYTE && type <= GL_DOUBLE) || 215b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_FIXED || type == GL_HALF_FLOAT || 216b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_INT_2_10_10_10_REV || 217b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_UNSIGNED_INT_2_10_10_10_REV); 218b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(size >= 1); 219b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(size <= 4); 220b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(format == GL_RGBA || format == GL_BGRA); 221b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 222b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (type == GL_INT_2_10_10_10_REV || 223b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_UNSIGNED_INT_2_10_10_10_REV) { 224b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(size == 4); 225b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(!integer); 226b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 227b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (format == GL_BGRA) { 228b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (type == GL_INT_2_10_10_10_REV) { 229b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 230b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_SNORM; 231b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 232b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_SSCALED; 233b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } else { 234b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 235b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_UNORM; 236b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 237b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_USCALED; 238b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 239b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } else { 240b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (type == GL_INT_2_10_10_10_REV) { 241b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 242b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_SNORM; 243b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 244b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_SSCALED; 245b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } else { 246b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 247b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_UNORM; 248b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 249b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_USCALED; 250b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 251b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 252b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 253b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 254b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (format == GL_BGRA) { 255b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* this is an odd-ball case */ 256b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(type == GL_UNSIGNED_BYTE); 257b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(normalized); 258b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B8G8R8A8_UNORM; 259b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 260b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 261b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (integer) { 262b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák switch (type) { 263b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_INT: return int_types_int[size-1]; 264b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_SHORT: return short_types_int[size-1]; 265b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_BYTE: return byte_types_int[size-1]; 266b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_INT: return uint_types_int[size-1]; 267b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_SHORT: return ushort_types_int[size-1]; 268b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_BYTE: return ubyte_types_int[size-1]; 269b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák default: assert(0); return 0; 270b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 271b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 272b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else if (normalized) { 273b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák switch (type) { 274b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_DOUBLE: return double_types[size-1]; 275b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FLOAT: return float_types[size-1]; 276b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_HALF_FLOAT: return half_float_types[size-1]; 277b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_INT: return int_types_norm[size-1]; 278b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_SHORT: return short_types_norm[size-1]; 279b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_BYTE: return byte_types_norm[size-1]; 280b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_INT: return uint_types_norm[size-1]; 281b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_SHORT: return ushort_types_norm[size-1]; 282b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_BYTE: return ubyte_types_norm[size-1]; 283b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FIXED: return fixed_types[size-1]; 284b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák default: assert(0); return 0; 285b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 286b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 287b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 288b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák switch (type) { 289b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_DOUBLE: return double_types[size-1]; 290b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FLOAT: return float_types[size-1]; 291b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_HALF_FLOAT: return half_float_types[size-1]; 292b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_INT: return int_types_scale[size-1]; 293b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_SHORT: return short_types_scale[size-1]; 294b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_BYTE: return byte_types_scale[size-1]; 295b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_INT: return uint_types_scale[size-1]; 296b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_SHORT: return ushort_types_scale[size-1]; 297b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_BYTE: return ubyte_types_scale[size-1]; 298b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FIXED: return fixed_types[size-1]; 299b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák default: assert(0); return 0; 300b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 301b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 302b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_NONE; /* silence compiler warning */ 303b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 304b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 305b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 306b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Examine the active arrays to determine if we have interleaved 307b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * vertex arrays all living in one VBO, or all living in user space. 308b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 309b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLboolean 310b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákis_interleaved_arrays(const struct st_vertex_program *vp, 311b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv, 312b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array **arrays) 313b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 314b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLuint attr; 315b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_buffer_object *firstBufObj = NULL; 316b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLint firstStride = -1; 317b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLubyte *firstPtr = NULL; 318b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLboolean userSpaceBuffer = GL_FALSE; 319b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 320b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák for (attr = 0; attr < vpv->num_inputs; attr++) { 321b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLuint mesaAttr = vp->index_to_input[attr]; 322b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array *array = arrays[mesaAttr]; 323b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_buffer_object *bufObj = array->BufferObj; 324b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLsizei stride = array->StrideB; /* in bytes */ 325b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 326b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (attr == 0) { 327b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* save info about the first array */ 328b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák firstStride = stride; 329b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák firstPtr = array->Ptr; 330b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák firstBufObj = bufObj; 331b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák userSpaceBuffer = !bufObj || !bufObj->Name; 332b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 333b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 334b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* check if other arrays interleave with the first, in same buffer */ 335b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (stride != firstStride) 336b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* strides don't match */ 337b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 338b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (bufObj != firstBufObj) 339b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* arrays in different VBOs */ 340b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 341b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (abs(array->Ptr - firstPtr) > firstStride) 342b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* arrays start too far apart */ 343b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 344b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if ((!_mesa_is_bufferobj(bufObj)) != userSpaceBuffer) 345b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* mix of VBO and user-space arrays */ 346b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 347b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 348b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 349b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_TRUE; 350b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 351b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 352b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 353b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Set up for drawing interleaved arrays that all live in one VBO 354b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * or all live in user space. 355b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param vbuffer returns vertex buffer info 356b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param velements returns vertex element info 357b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 358b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic boolean 359b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšáksetup_interleaved_attribs(const struct st_vertex_program *vp, 360b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv, 361b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array **arrays, 362b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_buffer *vbuffer, 363b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_element velements[]) 364b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 365b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLuint attr; 366b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLubyte *low_addr = NULL; 367b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLboolean usingVBO; /* all arrays in a VBO? */ 368b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_buffer_object *bufobj; 369b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLsizei stride; 370b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 371b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* Find the lowest address of the arrays we're drawing, 372b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Init bufobj and stride. 373b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 374b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (vpv->num_inputs) { 375b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLuint mesaAttr0 = vp->index_to_input[0]; 376b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array *array = arrays[mesaAttr0]; 377b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 378b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* Since we're doing interleaved arrays, we know there'll be at most 379b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * one buffer object and the stride will be the same for all arrays. 380b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Grab them now. 381b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 382b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák bufobj = array->BufferObj; 383b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák stride = array->StrideB; 384b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 385b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák low_addr = arrays[vp->index_to_input[0]]->Ptr; 386b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 387b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák for (attr = 1; attr < vpv->num_inputs; attr++) { 388b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLubyte *start = arrays[vp->index_to_input[attr]]->Ptr; 389b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák low_addr = MIN2(low_addr, start); 390b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 391b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 392b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 393b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* not sure we'll ever have zero inputs, but play it safe */ 394b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák bufobj = NULL; 395b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák stride = 0; 396b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák low_addr = 0; 397b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 398b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 399b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* are the arrays in user space? */ 400b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák usingVBO = _mesa_is_bufferobj(bufobj); 401b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 402b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák for (attr = 0; attr < vpv->num_inputs; attr++) { 403b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLuint mesaAttr = vp->index_to_input[attr]; 404b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array *array = arrays[mesaAttr]; 405b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák unsigned src_offset = (unsigned) (array->Ptr - low_addr); 406b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLuint element_size = array->_ElementSize; 407b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 408b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(element_size == array->Size * _mesa_sizeof_type(array->Type)); 409b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 410b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].src_offset = src_offset; 411b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].instance_divisor = array->InstanceDivisor; 412b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].vertex_buffer_index = 0; 413b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].src_format = st_pipe_vertex_format(array->Type, 414b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Size, 415b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Format, 416b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Normalized, 417b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Integer); 418b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(velements[attr].src_format); 419b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 420b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 421b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* 422b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Return the vbuffer info and setup user-space attrib info, if needed. 423b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 424b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (vpv->num_inputs == 0) { 425b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* just defensive coding here */ 426b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer = NULL; 427b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->user_buffer = NULL; 428b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer_offset = 0; 429b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->stride = 0; 430b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 431b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else if (usingVBO) { 432b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* all interleaved arrays in a VBO */ 433b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct st_buffer_object *stobj = st_buffer_object(bufobj); 434b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 435b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!stobj || !stobj->buffer) { 436b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return FALSE; /* out-of-memory error probably */ 437b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 438b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 439b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer = stobj->buffer; 440b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->user_buffer = NULL; 441b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer_offset = pointer_to_offset(low_addr); 442b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->stride = stride; 443b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 444b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 445b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* all interleaved arrays in user memory */ 446b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer = NULL; 447b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->user_buffer = low_addr; 448b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer_offset = 0; 449b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->stride = stride; 450b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 451b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return TRUE; 452b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 453b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 454b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 455b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Set up a separate pipe_vertex_buffer and pipe_vertex_element for each 456b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * vertex attribute. 457b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param vbuffer returns vertex buffer info 458b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param velements returns vertex element info 459b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 460b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic boolean 461b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšáksetup_non_interleaved_attribs(struct st_context *st, 462b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vertex_program *vp, 463b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv, 464b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array **arrays, 465b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_buffer vbuffer[], 466b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_element velements[]) 467b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 468b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_context *ctx = st->ctx; 469b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLuint attr; 470b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 471b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák for (attr = 0; attr < vpv->num_inputs; attr++) { 472b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLuint mesaAttr = vp->index_to_input[attr]; 473b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array *array = arrays[mesaAttr]; 474b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_buffer_object *bufobj = array->BufferObj; 475b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLsizei stride = array->StrideB; 476b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 477b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(array->_ElementSize == array->Size * _mesa_sizeof_type(array->Type)); 478b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 479b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (_mesa_is_bufferobj(bufobj)) { 480b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* Attribute data is in a VBO. 481b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Recall that for VBOs, the gl_client_array->Ptr field is 482b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * really an offset from the start of the VBO, not a pointer. 483b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 484b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct st_buffer_object *stobj = st_buffer_object(bufobj); 485b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 486b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!stobj || !stobj->buffer) { 487b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return FALSE; /* out-of-memory error probably */ 488b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 489b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 490b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].buffer = stobj->buffer; 491b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].user_buffer = NULL; 492b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].buffer_offset = pointer_to_offset(array->Ptr); 493b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 494b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 495b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* wrap user data */ 496b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák void *ptr; 497b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 498b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (array->Ptr) { 499b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák ptr = (void *) array->Ptr; 500b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 501b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 502b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* no array, use ctx->Current.Attrib[] value */ 503b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák ptr = (void *) ctx->Current.Attrib[mesaAttr]; 504b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák stride = 0; 505b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 506b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 507b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(ptr); 508b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 509b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].buffer = NULL; 510b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].user_buffer = ptr; 511b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].buffer_offset = 0; 512b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 513b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 514b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* common-case setup */ 515b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer[attr].stride = stride; /* in bytes */ 516b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 517b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].src_offset = 0; 518b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].instance_divisor = array->InstanceDivisor; 519b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].vertex_buffer_index = attr; 520b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements[attr].src_format = st_pipe_vertex_format(array->Type, 521b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Size, 522b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Format, 523b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Normalized, 524b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák array->Integer); 525b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(velements[attr].src_format); 526b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 527b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return TRUE; 528b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 529b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 530b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic void update_array(struct st_context *st) 531b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 532b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_context *ctx = st->ctx; 533b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_client_array **arrays = ctx->Array._DrawArrays; 534b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vertex_program *vp; 535b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv; 536b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_buffer vbuffer[PIPE_MAX_SHADER_INPUTS]; 537b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS]; 538b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák unsigned num_vbuffers, num_velements; 539b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 540b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák st->vertex_array_out_of_memory = FALSE; 541b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 542b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* No drawing has been done yet, so do nothing. */ 543b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!arrays) 544b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return; 545b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 546b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* vertex program validation must be done before this */ 547b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vp = st->vp; 548b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vpv = st->vp_variant; 549b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 550b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák memset(velements, 0, sizeof(struct pipe_vertex_element) * vpv->num_inputs); 551b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 552b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* 553b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Setup the vbuffer[] and velements[] arrays. 554b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 555b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (is_interleaved_arrays(vp, vpv, arrays)) { 556b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!setup_interleaved_attribs(vp, vpv, arrays, vbuffer, velements)) { 557b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák st->vertex_array_out_of_memory = TRUE; 558b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return; 559b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 560b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 561b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_vbuffers = 1; 562b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_velements = vpv->num_inputs; 563b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (num_velements == 0) 564b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_vbuffers = 0; 565b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 566b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 567b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!setup_non_interleaved_attribs(st, vp, vpv, arrays, vbuffer, 568b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák velements)) { 569b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák st->vertex_array_out_of_memory = TRUE; 570b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return; 571b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 572b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 573b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_vbuffers = vpv->num_inputs; 574b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_velements = vpv->num_inputs; 575b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 576b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 577b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák cso_set_vertex_buffers(st->cso_context, num_vbuffers, vbuffer); 578b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák cso_set_vertex_elements(st->cso_context, num_velements, velements); 579b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 580b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 581b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 582b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákconst struct st_tracked_state st_update_array = { 583b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák "st_update_array", /* name */ 584b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák { /* dirty */ 585b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák (_NEW_PROGRAM | _NEW_BUFFER_OBJECT), /* mesa */ 586b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák ST_NEW_VERTEX_ARRAYS | ST_NEW_VERTEX_PROGRAM, /* st */ 587b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák }, 588b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák update_array /* update */ 589b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 590