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 58 if (cb->user_buffer) { 59 buf = svga_user_buffer_create(pipe->screen, 60 (void *) cb->user_buffer, 61 cb->buffer_size, 62 PIPE_BIND_CONSTANT_BUFFER); 63 } 64 } 65 66 assert(shader < PIPE_SHADER_TYPES); 67 assert(index < ARRAY_SIZE(svga->curr.constbufs[shader])); 68 assert(index < svgascreen->max_const_buffers); 69 (void) svgascreen; 70 71 if (take_ownership) { 72 pipe_resource_reference(&svga->curr.constbufs[shader][index].buffer, NULL); 73 svga->curr.constbufs[shader][index].buffer = buf; 74 } else { 75 pipe_resource_reference(&svga->curr.constbufs[shader][index].buffer, buf); 76 } 77 78 /* Make sure the constant buffer size to be updated is within the 79 * limit supported by the device. 80 */ 81 svga->curr.constbufs[shader][index].buffer_size = 82 MIN2(buffer_size, SVGA_MAX_CONST_BUF_SIZE); 83 84 svga->curr.constbufs[shader][index].buffer_offset = cb ? cb->buffer_offset : 0; 85 svga->curr.constbufs[shader][index].user_buffer = NULL; /* not used */ 86 87 if (index == 0) { 88 if (shader == PIPE_SHADER_FRAGMENT) 89 svga->dirty |= SVGA_NEW_FS_CONSTS; 90 else if (shader == PIPE_SHADER_VERTEX) 91 svga->dirty |= SVGA_NEW_VS_CONSTS; 92 else if (shader == PIPE_SHADER_GEOMETRY) 93 svga->dirty |= SVGA_NEW_GS_CONSTS; 94 else if (shader == PIPE_SHADER_TESS_CTRL) 95 svga->dirty |= SVGA_NEW_TCS_CONSTS; 96 else if (shader == PIPE_SHADER_TESS_EVAL) 97 svga->dirty |= SVGA_NEW_TES_CONSTS; 98 else if (shader == PIPE_SHADER_COMPUTE) 99 svga->dirty |= SVGA_NEW_CS_CONSTS; 100 } else { 101 if (shader == PIPE_SHADER_FRAGMENT) 102 svga->dirty |= SVGA_NEW_FS_CONST_BUFFER; 103 else if (shader == PIPE_SHADER_VERTEX) 104 svga->dirty |= SVGA_NEW_VS_CONST_BUFFER; 105 else if (shader == PIPE_SHADER_GEOMETRY) 106 svga->dirty |= SVGA_NEW_GS_CONST_BUFFER; 107 else if (shader == PIPE_SHADER_TESS_CTRL) 108 svga->dirty |= SVGA_NEW_TCS_CONST_BUFFER; 109 else if (shader == PIPE_SHADER_TESS_EVAL) 110 svga->dirty |= SVGA_NEW_TES_CONST_BUFFER; 111 else if (shader == PIPE_SHADER_COMPUTE) 112 svga->dirty |= SVGA_NEW_CS_CONST_BUFFER; 113 114 /* update bitmask of dirty const buffers */ 115 svga->state.dirty_constbufs[shader] |= (1 << index); 116 117 /* purge any stale rawbuf srv */ 118 svga_destroy_rawbuf_srv(svga); 119 } 120 121 if (cb && cb->user_buffer) { 122 pipe_resource_reference(&buf, NULL); 123 } 124} 125 126 127void 128svga_init_constbuffer_functions(struct svga_context *svga) 129{ 130 svga->pipe.set_constant_buffer = svga_set_constant_buffer; 131} 132 133