1a1287f549a3e6527b8cf3bf5b5f563ba63c6f48cBrian Paul 2b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/************************************************************************** 3b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * 4877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc. 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: 35877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Keith Whitwell <keithw@vmware.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#include "main/bufferobj.h" 48a1287f549a3e6527b8cf3bf5b5f563ba63c6f48cBrian Paul#include "main/glformats.h" 49b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 50b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 51b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint double_types[4] = { 52b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64_FLOAT, 53b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64G64_FLOAT, 54b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64G64B64_FLOAT, 55b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R64G64B64A64_FLOAT 56b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 57b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 58b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint float_types[4] = { 59b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_FLOAT, 60b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_FLOAT, 61b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_FLOAT, 62b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_FLOAT 63b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 64b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 65b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint half_float_types[4] = { 66b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_FLOAT, 67b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_FLOAT, 68b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_FLOAT, 69b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_FLOAT 70b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 71b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 72b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint uint_types_norm[4] = { 73b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_UNORM, 74b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_UNORM, 75b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_UNORM, 76b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_UNORM 77b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 78b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 79b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint uint_types_scale[4] = { 80b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_USCALED, 81b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_USCALED, 82b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_USCALED, 83b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_USCALED 84b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 85b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 86b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint uint_types_int[4] = { 87b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_UINT, 88b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_UINT, 89b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_UINT, 90b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_UINT 91b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 92b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 93b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint int_types_norm[4] = { 94b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_SNORM, 95b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_SNORM, 96b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_SNORM, 97b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_SNORM 98b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 99b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 100b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint int_types_scale[4] = { 101b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_SSCALED, 102b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_SSCALED, 103b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_SSCALED, 104b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_SSCALED 105b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 106b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 107b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint int_types_int[4] = { 108b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_SINT, 109b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_SINT, 110b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_SINT, 111b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_SINT 112b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 113b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 114b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ushort_types_norm[4] = { 115b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_UNORM, 116b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_UNORM, 117b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_UNORM, 118b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_UNORM 119b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 120b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 121b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ushort_types_scale[4] = { 122b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_USCALED, 123b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_USCALED, 124b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_USCALED, 125b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_USCALED 126b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 127b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 128b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ushort_types_int[4] = { 129b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_UINT, 130b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_UINT, 131b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_UINT, 132b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_UINT 133b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 134b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 135b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint short_types_norm[4] = { 136b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_SNORM, 137b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_SNORM, 138b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_SNORM, 139b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_SNORM 140b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 141b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 142b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint short_types_scale[4] = { 143b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_SSCALED, 144b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_SSCALED, 145b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_SSCALED, 146b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_SSCALED 147b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 148b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 149b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint short_types_int[4] = { 150b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16_SINT, 151b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16_SINT, 152b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16_SINT, 153b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R16G16B16A16_SINT 154b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 155b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 156b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ubyte_types_norm[4] = { 157b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_UNORM, 158b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_UNORM, 159b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_UNORM, 160b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_UNORM 161b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 162b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 163b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ubyte_types_scale[4] = { 164b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_USCALED, 165b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_USCALED, 166b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_USCALED, 167b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_USCALED 168b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 169b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 170b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint ubyte_types_int[4] = { 171b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_UINT, 172b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_UINT, 173b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_UINT, 174b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_UINT 175b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 176b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 177b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint byte_types_norm[4] = { 178b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_SNORM, 179b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_SNORM, 180b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_SNORM, 181b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_SNORM 182b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 183b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 184b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint byte_types_scale[4] = { 185b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_SSCALED, 186b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_SSCALED, 187b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_SSCALED, 188b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_SSCALED 189b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 190b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 191b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint byte_types_int[4] = { 192b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8_SINT, 193b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8_SINT, 194b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8_SINT, 195b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R8G8B8A8_SINT 196b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 197b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 198b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLuint fixed_types[4] = { 199b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32_FIXED, 200b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32_FIXED, 201b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32_FIXED, 202b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák PIPE_FORMAT_R32G32B32A32_FIXED 203b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 204b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 205b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 206b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 207b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Return a PIPE_FORMAT_x for the given GL datatype and size. 208b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 209b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákenum pipe_format 210b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákst_pipe_vertex_format(GLenum type, GLuint size, GLenum format, 211b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLboolean normalized, GLboolean integer) 212b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 213b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert((type >= GL_BYTE && type <= GL_DOUBLE) || 214b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_FIXED || type == GL_HALF_FLOAT || 2151d6fe13c138efb836a28052b16260a258d113827Kevin Strasser type == GL_HALF_FLOAT_OES || 216b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_INT_2_10_10_10_REV || 217bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund type == GL_UNSIGNED_INT_2_10_10_10_REV || 218bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund type == GL_UNSIGNED_INT_10F_11F_11F_REV); 219b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(size >= 1); 220b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(size <= 4); 221b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(format == GL_RGBA || format == GL_BGRA); 222b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 223b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (type == GL_INT_2_10_10_10_REV || 224b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák type == GL_UNSIGNED_INT_2_10_10_10_REV) { 225b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(size == 4); 226b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(!integer); 227b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 228b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (format == GL_BGRA) { 229b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (type == GL_INT_2_10_10_10_REV) { 230b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 231b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_SNORM; 232b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 233b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_SSCALED; 234b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } else { 235b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 236b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_UNORM; 237b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 238b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B10G10R10A2_USCALED; 239b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 240b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } else { 241b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (type == GL_INT_2_10_10_10_REV) { 242b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 243b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_SNORM; 244b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 245b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_SSCALED; 246b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } else { 247b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (normalized) 248b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_UNORM; 249b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else 250b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_R10G10B10A2_USCALED; 251b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 252b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 253b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 254b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 255bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { 256bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund assert(size == 3); 257bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund assert(!integer); 258bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund assert(format == GL_RGBA); 259bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund 260bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund return PIPE_FORMAT_R11G11B10_FLOAT; 261bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund } 262bfc28e4affa1be012551a399f8936e0be5957b4dFredrik Höglund 263b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (format == GL_BGRA) { 264b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* this is an odd-ball case */ 265b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(type == GL_UNSIGNED_BYTE); 266b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(normalized); 267b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_B8G8R8A8_UNORM; 268b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 269b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 270b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (integer) { 271b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák switch (type) { 272b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_INT: return int_types_int[size-1]; 273b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_SHORT: return short_types_int[size-1]; 274b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_BYTE: return byte_types_int[size-1]; 275b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_INT: return uint_types_int[size-1]; 276b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_SHORT: return ushort_types_int[size-1]; 277b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_BYTE: return ubyte_types_int[size-1]; 278b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák default: assert(0); return 0; 279b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 280b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 281b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else if (normalized) { 282b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák switch (type) { 283b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_DOUBLE: return double_types[size-1]; 284b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FLOAT: return float_types[size-1]; 2851d6fe13c138efb836a28052b16260a258d113827Kevin Strasser case GL_HALF_FLOAT: 2861d6fe13c138efb836a28052b16260a258d113827Kevin Strasser case GL_HALF_FLOAT_OES: return half_float_types[size-1]; 287b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_INT: return int_types_norm[size-1]; 288b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_SHORT: return short_types_norm[size-1]; 289b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_BYTE: return byte_types_norm[size-1]; 290b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_INT: return uint_types_norm[size-1]; 291b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_SHORT: return ushort_types_norm[size-1]; 292b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_BYTE: return ubyte_types_norm[size-1]; 293b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FIXED: return fixed_types[size-1]; 294b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák default: assert(0); return 0; 295b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 296b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 297b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 298b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák switch (type) { 299b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_DOUBLE: return double_types[size-1]; 300b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FLOAT: return float_types[size-1]; 3011d6fe13c138efb836a28052b16260a258d113827Kevin Strasser case GL_HALF_FLOAT: 3021d6fe13c138efb836a28052b16260a258d113827Kevin Strasser case GL_HALF_FLOAT_OES: return half_float_types[size-1]; 303b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_INT: return int_types_scale[size-1]; 304b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_SHORT: return short_types_scale[size-1]; 305b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_BYTE: return byte_types_scale[size-1]; 306b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_INT: return uint_types_scale[size-1]; 307b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_SHORT: return ushort_types_scale[size-1]; 308b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_UNSIGNED_BYTE: return ubyte_types_scale[size-1]; 309b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák case GL_FIXED: return fixed_types[size-1]; 310b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák default: assert(0); return 0; 311b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 312b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 313b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return PIPE_FORMAT_NONE; /* silence compiler warning */ 314b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 315b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 316c538846e313c43858fb118db012b592513c0ed29Brian Paulstatic const struct gl_vertex_array * 317ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlieget_client_array(const struct st_vertex_program *vp, 318c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array **arrays, 319ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int attr) 320ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie{ 321ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie const GLuint mesaAttr = vp->index_to_input[attr]; 322ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie /* st_program uses 0xffffffff to denote a double placeholder attribute */ 323ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie if (mesaAttr == ST_DOUBLE_ATTRIB_PLACEHOLDER) 324ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie return NULL; 325ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie return arrays[mesaAttr]; 326ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie} 327ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 328b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 329b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Examine the active arrays to determine if we have interleaved 330b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * vertex arrays all living in one VBO, or all living in user space. 331b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 332b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic GLboolean 333b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákis_interleaved_arrays(const struct st_vertex_program *vp, 334b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv, 335c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array **arrays) 336b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 337b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLuint attr; 338b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct gl_buffer_object *firstBufObj = NULL; 339b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLint firstStride = -1; 340b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLubyte *firstPtr = NULL; 341b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLboolean userSpaceBuffer = GL_FALSE; 342b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 343b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák for (attr = 0; attr < vpv->num_inputs; attr++) { 344c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array *array; 345ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie const struct gl_buffer_object *bufObj; 346ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie GLsizei stride; 347ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 348ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array = get_client_array(vp, arrays, attr); 349ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie if (!array) 350ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie continue; 351b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 352ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie stride = array->StrideB; /* in bytes */ 353ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie bufObj = array->BufferObj; 354b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (attr == 0) { 355b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* save info about the first array */ 356b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák firstStride = stride; 357b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák firstPtr = array->Ptr; 358b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák firstBufObj = bufObj; 359b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák userSpaceBuffer = !bufObj || !bufObj->Name; 360b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 361b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 362b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* check if other arrays interleave with the first, in same buffer */ 363b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (stride != firstStride) 364b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* strides don't match */ 365b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 366b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (bufObj != firstBufObj) 367b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* arrays in different VBOs */ 368b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 369120c9c6380e83e732bd105619d6303498ef4efb7Francesco Ansanelli if (llabs(array->Ptr - firstPtr) > firstStride) 370b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* arrays start too far apart */ 371b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 372b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if ((!_mesa_is_bufferobj(bufObj)) != userSpaceBuffer) 373b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_FALSE; /* mix of VBO and user-space arrays */ 374b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 375b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 376b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 377b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return GL_TRUE; 378b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 379b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 380ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airliestatic void init_velement(struct pipe_vertex_element *velement, 381ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int src_offset, int format, 382ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int instance_divisor, int vbo_index) 383ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie{ 384ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie velement->src_offset = src_offset; 385ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie velement->src_format = format; 386ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie velement->instance_divisor = instance_divisor; 387ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie velement->vertex_buffer_index = vbo_index; 388ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie assert(velement->src_format); 389ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie} 390ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 391ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airliestatic void init_velement_lowered(struct st_context *st, 392d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle const struct st_vertex_program *vp, 393ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie struct pipe_vertex_element *velements, 394ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int src_offset, int format, 395ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int instance_divisor, int vbo_index, 396ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int nr_components, GLboolean doubles, 397ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie GLuint *attr_idx) 398ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie{ 399ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int idx = *attr_idx; 400ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie if (doubles) { 401ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie int lower_format; 402ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 403d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle if (nr_components < 2) 404ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie lower_format = PIPE_FORMAT_R32G32_UINT; 405d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle else 406ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie lower_format = PIPE_FORMAT_R32G32B32A32_UINT; 407ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 408ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie init_velement(&velements[idx], src_offset, 409ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie lower_format, instance_divisor, vbo_index); 410ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie idx++; 411ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 412d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle if (idx < vp->num_inputs && 413d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vp->index_to_input[idx] == ST_DOUBLE_ATTRIB_PLACEHOLDER) { 414d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle if (nr_components >= 3) { 415d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle if (nr_components == 3) 416d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle lower_format = PIPE_FORMAT_R32G32_UINT; 417d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle else 418d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle lower_format = PIPE_FORMAT_R32G32B32A32_UINT; 419d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle 420d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle init_velement(&velements[idx], src_offset + 4 * sizeof(float), 421d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle lower_format, instance_divisor, vbo_index); 422d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle } else { 423d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle /* The values here are undefined. Fill in some conservative 424d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle * dummy values. 425d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle */ 426d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle init_velement(&velements[idx], src_offset, PIPE_FORMAT_R32G32_UINT, 427d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle instance_divisor, vbo_index); 428d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle } 429ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 430ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie idx++; 431ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie } 432ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie } else { 433ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie init_velement(&velements[idx], src_offset, 434ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie format, instance_divisor, vbo_index); 435ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie idx++; 436ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie } 437ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie *attr_idx = idx; 438ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie} 439ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 440b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 441b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Set up for drawing interleaved arrays that all live in one VBO 442b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * or all live in user space. 443b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param vbuffer returns vertex buffer info 444b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param velements returns vertex element info 445b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 446b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic boolean 447ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airliesetup_interleaved_attribs(struct st_context *st, 448ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie const struct st_vertex_program *vp, 449b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv, 450c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array **arrays, 451b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_buffer *vbuffer, 452d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle struct pipe_vertex_element velements[]) 453b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 454d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle GLuint attr; 455b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLubyte *low_addr = NULL; 456b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLboolean usingVBO; /* all arrays in a VBO? */ 457b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_buffer_object *bufobj; 458b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák GLsizei stride; 459b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 460b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* Find the lowest address of the arrays we're drawing, 461b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Init bufobj and stride. 462b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 463b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (vpv->num_inputs) { 464c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array *array; 465ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 466ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array = get_client_array(vp, arrays, 0); 467ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie assert(array); 468b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 469b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* Since we're doing interleaved arrays, we know there'll be at most 470b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * one buffer object and the stride will be the same for all arrays. 471b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Grab them now. 472b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 473b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák bufobj = array->BufferObj; 474b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák stride = array->StrideB; 475b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 476b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák low_addr = arrays[vp->index_to_input[0]]->Ptr; 477b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 478b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák for (attr = 1; attr < vpv->num_inputs; attr++) { 479ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie const GLubyte *start; 480ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array = get_client_array(vp, arrays, attr); 481ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie if (!array) 482ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie continue; 483ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie start = array->Ptr; 484b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák low_addr = MIN2(low_addr, start); 485b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 486b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 487b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 488b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* not sure we'll ever have zero inputs, but play it safe */ 489b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák bufobj = NULL; 490b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák stride = 0; 491b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák low_addr = 0; 492b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 493b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 494b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* are the arrays in user space? */ 495b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák usingVBO = _mesa_is_bufferobj(bufobj); 496b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 497d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle for (attr = 0; attr < vpv->num_inputs;) { 498c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array *array; 499ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie unsigned src_offset; 500ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie unsigned src_format; 501ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 502ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array = get_client_array(vp, arrays, attr); 503d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle assert(array); 504b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 505ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie src_offset = (unsigned) (array->Ptr - low_addr); 506ee351ea178daed07e121617d324e069b8906d345Marek Olšák assert(array->_ElementSize == 507ee351ea178daed07e121617d324e069b8906d345Marek Olšák _mesa_bytes_per_vertex_attrib(array->Size, array->Type)); 508b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 509ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie src_format = st_pipe_vertex_format(array->Type, 510ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Size, 511ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Format, 512ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Normalized, 513ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Integer); 514ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 515d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle init_velement_lowered(st, vp, velements, src_offset, src_format, 516ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->InstanceDivisor, 0, 517d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle array->Size, array->Doubles, &attr); 518b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 519b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 520b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* 521b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Return the vbuffer info and setup user-space attrib info, if needed. 522b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 523b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (vpv->num_inputs == 0) { 524b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* just defensive coding here */ 525b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer = NULL; 526b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->user_buffer = NULL; 527b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer_offset = 0; 528b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->stride = 0; 529b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 530b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else if (usingVBO) { 531b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* all interleaved arrays in a VBO */ 532b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct st_buffer_object *stobj = st_buffer_object(bufobj); 533b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 534b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!stobj || !stobj->buffer) { 535b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return FALSE; /* out-of-memory error probably */ 536b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 537b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 538b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer = stobj->buffer; 539b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->user_buffer = NULL; 540b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer_offset = pointer_to_offset(low_addr); 541b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->stride = stride; 542b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 543b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 544b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* all interleaved arrays in user memory */ 545b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer = NULL; 546b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->user_buffer = low_addr; 547b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->buffer_offset = 0; 548b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vbuffer->stride = stride; 549b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 550b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return TRUE; 551b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 552b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 553b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák/** 554b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Set up a separate pipe_vertex_buffer and pipe_vertex_element for each 555b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * vertex attribute. 556b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param vbuffer returns vertex buffer info 557b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * \param velements returns vertex element info 558b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 559b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic boolean 560b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšáksetup_non_interleaved_attribs(struct st_context *st, 561b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vertex_program *vp, 562b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv, 563c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array **arrays, 564b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_buffer vbuffer[], 565ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie struct pipe_vertex_element velements[], 566d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle unsigned *num_vbuffers) 567b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 568b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_context *ctx = st->ctx; 569d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle GLuint attr; 570b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 571d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle *num_vbuffers = 0; 572d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle 573d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle for (attr = 0; attr < vpv->num_inputs;) { 574b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const GLuint mesaAttr = vp->index_to_input[attr]; 575c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array *array; 576ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie struct gl_buffer_object *bufobj; 577ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie GLsizei stride; 578ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie unsigned src_format; 579d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle unsigned bufidx; 580b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 581ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array = get_client_array(vp, arrays, attr); 582d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle assert(array); 583d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle 584d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle bufidx = (*num_vbuffers)++; 585ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 586ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie stride = array->StrideB; 587ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie bufobj = array->BufferObj; 588ee351ea178daed07e121617d324e069b8906d345Marek Olšák assert(array->_ElementSize == 589ee351ea178daed07e121617d324e069b8906d345Marek Olšák _mesa_bytes_per_vertex_attrib(array->Size, array->Type)); 590b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 591b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (_mesa_is_bufferobj(bufobj)) { 592b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* Attribute data is in a VBO. 593c538846e313c43858fb118db012b592513c0ed29Brian Paul * Recall that for VBOs, the gl_vertex_array->Ptr field is 594b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * really an offset from the start of the VBO, not a pointer. 595b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 596b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct st_buffer_object *stobj = st_buffer_object(bufobj); 597b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 598b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!stobj || !stobj->buffer) { 599b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return FALSE; /* out-of-memory error probably */ 600b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 601b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 602d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].buffer = stobj->buffer; 603d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].user_buffer = NULL; 604d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].buffer_offset = pointer_to_offset(array->Ptr); 605b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 606b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 607b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* wrap user data */ 608b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák void *ptr; 609b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 610b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (array->Ptr) { 611b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák ptr = (void *) array->Ptr; 612b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 613b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 614b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* no array, use ctx->Current.Attrib[] value */ 615b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák ptr = (void *) ctx->Current.Attrib[mesaAttr]; 616b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák stride = 0; 617b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 618b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 619b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák assert(ptr); 620b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 621d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].buffer = NULL; 622d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].user_buffer = ptr; 623d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].buffer_offset = 0; 624b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 625b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 626b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* common-case setup */ 627d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle vbuffer[bufidx].stride = stride; /* in bytes */ 628b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 629ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie src_format = st_pipe_vertex_format(array->Type, 630ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Size, 631ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Format, 632ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Normalized, 633ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie array->Integer); 634ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 635d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle init_velement_lowered(st, vp, velements, 0, src_format, 636d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle array->InstanceDivisor, bufidx, 637d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle array->Size, array->Doubles, &attr); 638b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 639ef83c9b762ee083a2bf1948befdb5dd0fb8df00bDave Airlie 640b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return TRUE; 641b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 642b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 643b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákstatic void update_array(struct st_context *st) 644b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák{ 645b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct gl_context *ctx = st->ctx; 646c538846e313c43858fb118db012b592513c0ed29Brian Paul const struct gl_vertex_array **arrays = ctx->Array._DrawArrays; 647b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vertex_program *vp; 648b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák const struct st_vp_variant *vpv; 649b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_buffer vbuffer[PIPE_MAX_SHADER_INPUTS]; 650b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS]; 651d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle unsigned num_vbuffers; 652b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 653b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák st->vertex_array_out_of_memory = FALSE; 654b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 655b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* No drawing has been done yet, so do nothing. */ 656b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!arrays) 657b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return; 658b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 659b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* vertex program validation must be done before this */ 660b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vp = st->vp; 661b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák vpv = st->vp_variant; 662b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 663b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák memset(velements, 0, sizeof(struct pipe_vertex_element) * vpv->num_inputs); 664b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 665b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák /* 666b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák * Setup the vbuffer[] and velements[] arrays. 667b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák */ 668b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (is_interleaved_arrays(vp, vpv, arrays)) { 669d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle if (!setup_interleaved_attribs(st, vp, vpv, arrays, vbuffer, velements)) { 670b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák st->vertex_array_out_of_memory = TRUE; 671b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return; 672b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 673b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 674b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_vbuffers = 1; 675d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle if (vpv->num_inputs == 0) 676b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák num_vbuffers = 0; 677b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 678b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák else { 679b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák if (!setup_non_interleaved_attribs(st, vp, vpv, arrays, vbuffer, 680d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle velements, &num_vbuffers)) { 681b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák st->vertex_array_out_of_memory = TRUE; 682b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák return; 683b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 684b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák } 685b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 686e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák cso_set_vertex_buffers(st->cso_context, 0, num_vbuffers, vbuffer); 687e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák if (st->last_num_vbuffers > num_vbuffers) { 688e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák /* Unbind remaining buffers, if any. */ 689e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák cso_set_vertex_buffers(st->cso_context, num_vbuffers, 690e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák st->last_num_vbuffers - num_vbuffers, NULL); 691e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák } 692e73bf3b805de78299f1a652668ba4e6eab9bac94Marek Olšák st->last_num_vbuffers = num_vbuffers; 693d413fbb159d0ddac16bb9d93bdda4fe598d39e17Nicolai Hähnle cso_set_vertex_elements(st->cso_context, vpv->num_inputs, velements); 694b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák} 695b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 696b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák 697b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšákconst struct st_tracked_state st_update_array = { 698b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák update_array /* update */ 699b4753dafcce4fc771ec3d7e3d5781bd4cae20326Marek Olšák}; 700