static enum pipe_error emit_consts_vgpu10(struct svga_context *svga, unsigned shader) { enum pipe_error ret; unsigned dirty_constbufs; unsigned enabled_constbufs; /* Emit 0th constant buffer (with extra constants) */ ret = emit_constbuf_vgpu10(svga, shader); if (ret != PIPE_OK) { return ret; } enabled_constbufs = svga->state.hw_draw.enabled_constbufs[shader] | 1u; /* Emit other constant buffers (UBOs) */ dirty_constbufs = svga->state.dirty_constbufs[shader] & ~1u; while (dirty_constbufs) { unsigned index = u_bit_scan(&dirty_constbufs); unsigned offset = svga->curr.constbufs[shader][index].buffer_offset; unsigned size = svga->curr.constbufs[shader][index].buffer_size; struct svga_buffer *buffer = svga_buffer(svga->curr.constbufs[shader][index].buffer); struct svga_winsys_surface *handle; if (buffer) { handle = svga_buffer_handle(svga, &buffer->b.b); enabled_constbufs |= 1 << index; } else { handle = NULL; enabled_constbufs &= ~(1 << index); assert(offset == 0); assert(size == 0); } assert(size % 16 == 0); ret = SVGA3D_vgpu10_SetSingleConstantBuffer(svga->swc, index, svga_shader_type(shader), handle, offset, size); if (ret != PIPE_OK) return ret; } svga->state.hw_draw.enabled_constbufs[shader] = enabled_constbufs; svga->state.dirty_constbufs[shader] = 0; return ret; }
static enum pipe_error emit_consts_vgpu10(struct svga_context *svga, unsigned shader) { enum pipe_error ret; unsigned dirty_constbufs; unsigned enabled_constbufs; /* Emit 0th constant buffer (with extra constants) */ ret = emit_constbuf_vgpu10(svga, shader); if (ret != PIPE_OK) { return ret; } enabled_constbufs = svga->state.hw_draw.enabled_constbufs[shader] | 1u; /* Emit other constant buffers (UBOs) */ dirty_constbufs = svga->state.dirty_constbufs[shader] & ~1u; while (dirty_constbufs) { unsigned index = u_bit_scan(&dirty_constbufs); unsigned offset = svga->curr.constbufs[shader][index].buffer_offset; unsigned size = svga->curr.constbufs[shader][index].buffer_size; struct svga_buffer *buffer = svga_buffer(svga->curr.constbufs[shader][index].buffer); struct svga_winsys_surface *handle; if (buffer) { handle = svga_buffer_handle(svga, &buffer->b.b); enabled_constbufs |= 1 << index; } else { handle = NULL; enabled_constbufs &= ~(1 << index); assert(offset == 0); assert(size == 0); } if (size % 16 != 0) { /* GL's buffer range sizes can be any number of bytes but the * SVGA3D device requires a multiple of 16 bytes. */ const unsigned total_size = buffer->b.b.width0; if (offset + align(size, 16) <= total_size) { /* round up size to multiple of 16 */ size = align(size, 16); } else { /* round down to mulitple of 16 (this may cause rendering problems * but should avoid a device error). */ size &= ~15; } } assert(size % 16 == 0); ret = SVGA3D_vgpu10_SetSingleConstantBuffer(svga->swc, index, svga_shader_type(shader), handle, offset, size); if (ret != PIPE_OK) return ret; svga->hud.num_const_buf_updates++; } svga->state.hw_draw.enabled_constbufs[shader] = enabled_constbufs; svga->state.dirty_constbufs[shader] = 0; return ret; }