1 /************************************************************************** 2 * 3 * Copyright 2014 Ilia Mirkin. All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 **************************************************************************/ 26 27 #include "main/imports.h" 28 #include "program/prog_parameter.h" 29 #include "program/prog_print.h" 30 #include "compiler/glsl/ir_uniform.h" 31 32 #include "pipe/p_context.h" 33 #include "pipe/p_defines.h" 34 #include "util/u_inlines.h" 35 #include "util/u_surface.h" 36 37 #include "st_debug.h" 38 #include "st_cb_bufferobjects.h" 39 #include "st_context.h" 40 #include "st_atom.h" 41 #include "st_program.h" 42 43 static void 44 st_bind_atomics(struct st_context *st, 45 struct gl_shader_program *prog, 46 enum pipe_shader_type shader_type) 47 { 48 unsigned i; 49 50 if (!prog || !st->pipe->set_shader_buffers) 51 return; 52 53 for (i = 0; i < prog->data->NumAtomicBuffers; i++) { 54 struct gl_active_atomic_buffer *atomic = &prog->data->AtomicBuffers[i]; 55 struct gl_atomic_buffer_binding *binding = 56 &st->ctx->AtomicBufferBindings[atomic->Binding]; 57 struct st_buffer_object *st_obj = 58 st_buffer_object(binding->BufferObject); 59 struct pipe_shader_buffer sb = { 0 }; 60 61 if (st_obj && st_obj->buffer) { 62 sb.buffer = st_obj->buffer; 63 sb.buffer_offset = binding->Offset; 64 sb.buffer_size = st_obj->buffer->width0 - binding->Offset; 65 } 66 67 st->pipe->set_shader_buffers(st->pipe, shader_type, 68 atomic->Binding, 1, &sb); 69 } 70 } 71 72 static void 73 bind_vs_atomics(struct st_context *st) 74 { 75 struct gl_shader_program *prog = 76 st->ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX]; 77 78 st_bind_atomics(st, prog, PIPE_SHADER_VERTEX); 79 } 80 81 const struct st_tracked_state st_bind_vs_atomics = { 82 bind_vs_atomics 83 }; 84 85 static void 86 bind_fs_atomics(struct st_context *st) 87 { 88 struct gl_shader_program *prog = 89 st->ctx->_Shader->CurrentProgram[MESA_SHADER_FRAGMENT]; 90 91 st_bind_atomics(st, prog, PIPE_SHADER_FRAGMENT); 92 } 93 94 const struct st_tracked_state st_bind_fs_atomics = { 95 bind_fs_atomics 96 }; 97 98 static void 99 bind_gs_atomics(struct st_context *st) 100 { 101 struct gl_shader_program *prog = 102 st->ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]; 103 104 st_bind_atomics(st, prog, PIPE_SHADER_GEOMETRY); 105 } 106 107 const struct st_tracked_state st_bind_gs_atomics = { 108 bind_gs_atomics 109 }; 110 111 static void 112 bind_tcs_atomics(struct st_context *st) 113 { 114 struct gl_shader_program *prog = 115 st->ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_CTRL]; 116 117 st_bind_atomics(st, prog, PIPE_SHADER_TESS_CTRL); 118 } 119 120 const struct st_tracked_state st_bind_tcs_atomics = { 121 bind_tcs_atomics 122 }; 123 124 static void 125 bind_tes_atomics(struct st_context *st) 126 { 127 struct gl_shader_program *prog = 128 st->ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_EVAL]; 129 130 st_bind_atomics(st, prog, PIPE_SHADER_TESS_EVAL); 131 } 132 133 const struct st_tracked_state st_bind_tes_atomics = { 134 bind_tes_atomics 135 }; 136 137 static void 138 bind_cs_atomics(struct st_context *st) 139 { 140 struct gl_shader_program *prog = 141 st->ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE]; 142 143 st_bind_atomics(st, prog, PIPE_SHADER_COMPUTE); 144 } 145 146 const struct st_tracked_state st_bind_cs_atomics = { 147 bind_cs_atomics 148 }; 149