157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez/* 257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * Copyright (C) 2009-2010 Francisco Jerez. 357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * All Rights Reserved. 457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * 557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * Permission is hereby granted, free of charge, to any person obtaining 657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * a copy of this software and associated documentation files (the 757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * "Software"), to deal in the Software without restriction, including 857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * without limitation the rights to use, copy, modify, merge, publish, 957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * distribute, sublicense, and/or sell copies of the Software, and to 1057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * permit persons to whom the Software is furnished to do so, subject to 1157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * the following conditions: 1257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * 1357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * The above copyright notice and this permission notice (including the 1457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * next paragraph) shall be included in all copies or substantial 1557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * portions of the Software. 1657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * 1757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 2157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 2257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 2357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez * 2557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez */ 2657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 2757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez#include "main/bufferobj.h" 2857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez#include "nouveau_driver.h" 2957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez#include "nouveau_array.h" 3057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez#include "nouveau_bufferobj.h" 312e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#include "nouveau_context.h" 3257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 334aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled#define EXTRACT(in_t, out_t) extract_func_##in_t##_to_##out_t 344aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled 354aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled#define EXTRACT_FUNC(in_t, out_t, k) \ 364aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledstatic out_t EXTRACT(in_t, out_t) \ 374aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled(struct nouveau_array *a, int i, int j) { \ 384aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled in_t x = ((in_t *)(a->buf + i * a->stride))[j]; \ 394aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled \ 404aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled return (out_t)x / (k); \ 414aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled} 424aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled 434aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLchar, unsigned, 1); 444aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLchar, float, SCHAR_MAX); 454aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLubyte, unsigned, 1); 464aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLubyte, float, UCHAR_MAX); 474aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLshort, unsigned, 1); 484aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLshort, float, SHRT_MAX); 494aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLushort, unsigned, 1); 504aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLushort, float, USHRT_MAX); 514aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLint, unsigned, 1); 524aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLint, float, INT_MAX); 534aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLuint, unsigned, 1); 544aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLuint, float, UINT_MAX); 554aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLfloat, unsigned, 1.0 / UINT_MAX); 564aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobledEXTRACT_FUNC(GLfloat, float, 1); 574aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled 584aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled#undef EXTRACT_FUNC 594aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled 6057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerezstatic void 6157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerezget_array_extract(struct nouveau_array *a, extract_u_t *extract_u, 6257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez extract_f_t *extract_f) 6357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez{ 6457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez switch (a->type) { 6557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_BYTE: 664aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLchar, unsigned); 674aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLchar, float); 6857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 6957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_UNSIGNED_BYTE: 704aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLubyte, unsigned); 714aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLubyte, float); 7257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 7357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_SHORT: 744aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLshort, unsigned); 754aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLshort, float); 7657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 7757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_UNSIGNED_SHORT: 784aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLushort, unsigned); 794aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLushort, float); 8057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 8157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_INT: 824aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLint, unsigned); 834aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLint, float); 8457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 8557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_UNSIGNED_INT: 864aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLuint, unsigned); 874aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLuint, float); 8857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 8957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez case GL_FLOAT: 904aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_u = EXTRACT(GLfloat, unsigned); 914aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled *extract_f = EXTRACT(GLfloat, float); 9257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez break; 9357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez default: 9457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez assert(0); 9557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez } 9657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez} 974aa1ac5fe94b5696095229ee3568bf4fa7cfed95nobled#undef EXTRACT 9857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 9957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerezvoid 10057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jereznouveau_init_array(struct nouveau_array *a, int attr, int stride, 10157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez int fields, int type, struct gl_buffer_object *obj, 1022e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs const void *ptr, GLboolean map, struct gl_context *ctx) 10357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez{ 1042e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_client *client = context_client(ctx); 1052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 10657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->attr = attr; 10757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->stride = stride; 10857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->fields = fields; 10957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->type = type; 11057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->buf = NULL; 11157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 11257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez if (obj) { 113f67fa5229331f6d4920175dd0d6e1e6a2c69c060Francisco Jerez if (nouveau_bufferobj_hw(obj)) { 11457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez struct nouveau_bufferobj *nbo = 11557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez to_nouveau_bufferobj(obj); 11657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 11757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez nouveau_bo_ref(nbo->bo, &a->bo); 11857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->offset = (intptr_t)ptr; 11957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 12057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez if (map) { 1212e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bo_map(a->bo, NOUVEAU_BO_RD, client); 12257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->buf = a->bo->map + a->offset; 12357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez } 12457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 12557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez } else { 12657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez nouveau_bo_ref(NULL, &a->bo); 12757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->offset = 0; 12857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 12957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez if (map) 130f67fa5229331f6d4920175dd0d6e1e6a2c69c060Francisco Jerez a->buf = ADD_POINTERS( 131f67fa5229331f6d4920175dd0d6e1e6a2c69c060Francisco Jerez nouveau_bufferobj_sys(obj), ptr); 13257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez } 13357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez } 13457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 13557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez if (a->buf) 13657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez get_array_extract(a, &a->extract_u, &a->extract_f); 13757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez} 13857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 13957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerezvoid 14057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jereznouveau_deinit_array(struct nouveau_array *a) 14157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez{ 14257382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->buf = NULL; 14357382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez a->fields = 0; 14457382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez} 14557382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez 14657382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerezvoid 14757382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jereznouveau_cleanup_array(struct nouveau_array *a) 14857382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez{ 14957382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez nouveau_deinit_array(a); 15057382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez nouveau_bo_ref(NULL, &a->bo); 15157382e71ef892a36ca2171fe8758aba6c9c885e6Francisco Jerez} 152