1/********************************************************** 2 * Copyright 2008-2009 VMware, Inc. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person 5 * obtaining a copy of this software and associated documentation 6 * files (the "Software"), to deal in the Software without 7 * restriction, including without limitation the rights to use, copy, 8 * modify, merge, publish, distribute, sublicense, and/or sell copies 9 * of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **********************************************************/ 25 26#include "util/u_inlines.h" 27#include "pipe/p_defines.h" 28#include "util/u_math.h" 29#include "tgsi/tgsi_parse.h" 30 31#include "svga_context.h" 32#include "svga_resource_buffer.h" 33 34 35struct svga_constbuf 36{ 37 unsigned type; 38 float (*data)[4]; 39 unsigned count; 40}; 41 42 43 44static void 45svga_set_constant_buffer(struct pipe_context *pipe, 46 enum pipe_shader_type shader, uint index, 47 bool take_ownership, 48 const struct pipe_constant_buffer *cb) 49{ 50 struct svga_screen *svgascreen = svga_screen(pipe->screen); 51 struct svga_context *svga = svga_context(pipe); 52 struct pipe_resource *buf = cb ? cb->buffer : NULL; 53 unsigned buffer_size = 0; 54 55 if (cb) { 56 buffer_size = cb->buffer_size; 57 if (cb->user_buffer) { 58 buf = svga_user_buffer_create(pipe->screen, 59 (void *) cb->user_buffer, 60 cb->buffer_size, 61 PIPE_BIND_CONSTANT_BUFFER); 62 } 63 } 64 65 assert(shader < PIPE_SHADER_TYPES); 66 assert(index < ARRAY_SIZE(svga->curr.constbufs[shader])); 67 assert(index < svgascreen->max_const_buffers); 68 (void) svgascreen; 69 70 if (take_ownership) { 71 pipe_resource_reference(&svga->curr.constbufs[shader][index].buffer, NULL); 72 svga->curr.constbufs[shader][index].buffer = buf; 73 } else { 74 pipe_resource_reference(&svga->curr.constbufs[shader][index].buffer, buf); 75 } 76 77 /* Make sure the constant buffer size to be updated is within the 78 * limit supported by the device. 79 */ 80 svga->curr.constbufs[shader][index].buffer_size = 81 MIN2(buffer_size, SVGA_MAX_CONST_BUF_SIZE); 82 83 svga->curr.constbufs[shader][index].buffer_offset = cb ? cb->buffer_offset : 0; 84 svga->curr.constbufs[shader][index].user_buffer = NULL; /* not used */ 85 86 if (index == 0) { 87 if (shader == PIPE_SHADER_FRAGMENT) 88 svga->dirty |= SVGA_NEW_FS_CONSTS; 89 else if (shader == PIPE_SHADER_VERTEX) 90 svga->dirty |= SVGA_NEW_VS_CONSTS; 91 else if (shader == PIPE_SHADER_GEOMETRY) 92 svga->dirty |= SVGA_NEW_GS_CONSTS; 93 else if (shader == PIPE_SHADER_TESS_CTRL) 94 svga->dirty |= SVGA_NEW_TCS_CONSTS; 95 else if (shader == PIPE_SHADER_TESS_EVAL) 96 svga->dirty |= SVGA_NEW_TES_CONSTS; 97 } else { 98 if (shader == PIPE_SHADER_FRAGMENT) 99 svga->dirty |= SVGA_NEW_FS_CONST_BUFFER; 100 else if (shader == PIPE_SHADER_VERTEX) 101 svga->dirty |= SVGA_NEW_VS_CONST_BUFFER; 102 else if (shader == PIPE_SHADER_GEOMETRY) 103 svga->dirty |= SVGA_NEW_GS_CONST_BUFFER; 104 else if (shader == PIPE_SHADER_TESS_CTRL) 105 svga->dirty |= SVGA_NEW_TCS_CONST_BUFFER; 106 else if (shader == PIPE_SHADER_TESS_EVAL) 107 svga->dirty |= SVGA_NEW_TES_CONST_BUFFER; 108 109 /* update bitmask of dirty const buffers */ 110 svga->state.dirty_constbufs[shader] |= (1 << index); 111 } 112 113 if (cb && cb->user_buffer) { 114 pipe_resource_reference(&buf, NULL); 115 } 116} 117 118 119void 120svga_init_constbuffer_functions(struct svga_context *svga) 121{ 122 svga->pipe.set_constant_buffer = svga_set_constant_buffer; 123} 124 125