1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef U_INLINES_H 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define U_INLINES_H 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug_describe.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug_refcnt.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_atomic.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_box.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" { 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Reference counting helper functions. 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_reference_init(struct pipe_reference *reference, unsigned count) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_atomic_set(&reference->count, count); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_is_referenced(struct pipe_reference *reference) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p_atomic_read(&reference->count) != 0; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Update reference counting. 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The old thing pointed to, if any, will be unreferenced. 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Both 'ptr' and 'reference' may be NULL. 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return TRUE if the object's refcount hits zero and should be destroyed. 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_reference_described(struct pipe_reference *ptr, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_reference *reference, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_reference_descriptor get_desc) 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean destroy = FALSE; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ptr != reference) { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* bump the reference.count first */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reference) { 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pipe_is_referenced(reference)); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_atomic_inc(&reference->count); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_reference(reference, get_desc, 1); 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ptr) { 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pipe_is_referenced(ptr)); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p_atomic_dec_zero(&ptr->count)) { 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org destroy = TRUE; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_reference(ptr, get_desc, -1); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return destroy; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_reference(struct pipe_reference *ptr, struct pipe_reference *reference) 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pipe_reference_described(ptr, reference, 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_reference); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_surface_reference(struct pipe_surface **ptr, struct pipe_surface *surf) 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *old_surf = *ptr; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe_reference_described(&(*ptr)->reference, &surf->reference, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_surface)) 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_surf->context->surface_destroy(old_surf->context, old_surf); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ptr = surf; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Similar to pipe_surface_reference() but always set the pointer to NULL 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and pass in an explicit context. The explicit context avoids the problem 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of using a deleted context's surface_destroy() method when freeing a surface 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that's shared by multiple contexts. 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_surface_release(struct pipe_context *pipe, struct pipe_surface **ptr) 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe_reference_described(&(*ptr)->reference, NULL, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_surface)) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->surface_destroy(pipe, *ptr); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ptr = NULL; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_resource_reference(struct pipe_resource **ptr, struct pipe_resource *tex) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *old_tex = *ptr; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe_reference_described(&(*ptr)->reference, &tex->reference, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_resource)) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_tex->screen->resource_destroy(old_tex->screen, old_tex); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ptr = tex; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_sampler_view_reference(struct pipe_sampler_view **ptr, struct pipe_sampler_view *view) 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *old_view = *ptr; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe_reference_described(&(*ptr)->reference, &view->reference, 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_sampler_view)) 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old_view->context->sampler_view_destroy(old_view->context, old_view); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ptr = view; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Similar to pipe_sampler_view_reference() but always set the pointer to 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NULL and pass in an explicit context. Passing an explicit context is a 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * work-around for fixing a dangling context pointer problem when textures 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are shared by multiple contexts. XXX fix this someday. 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_sampler_view_release(struct pipe_context *ctx, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view **ptr) 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view *old_view = *ptr; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*ptr && (*ptr)->context != ctx) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf_once(("context mis-match in pipe_sampler_view_release()\n")); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe_reference_described(&(*ptr)->reference, NULL, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_sampler_view)) { 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->sampler_view_destroy(ctx, old_view); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ptr = NULL; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_so_target_reference(struct pipe_stream_output_target **ptr, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target *target) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_target *old = *ptr; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pipe_reference_described(&(*ptr)->reference, &target->reference, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (debug_reference_descriptor)debug_describe_so_target)) 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org old->context->stream_output_target_destroy(old->context, old); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ptr = target; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_surface_reset(struct pipe_context *ctx, struct pipe_surface* ps, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *pt, unsigned level, unsigned layer, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags) 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&ps->texture, pt); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->format = pt->format; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->width = u_minify(pt->width0, level); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->height = u_minify(pt->height0, level); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->usage = flags; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->u.tex.level = level; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->u.tex.first_layer = ps->u.tex.last_layer = layer; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->context = ctx; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_surface_init(struct pipe_context *ctx, struct pipe_surface* ps, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *pt, unsigned level, unsigned layer, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ps->texture = 0; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_reference_init(&ps->reference, 1); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface_reset(ctx, ps, pt, level, layer, flags); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Return true if the surfaces are equal. */ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_surface_equal(struct pipe_surface *s1, struct pipe_surface *s2) 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return s1->texture == s2->texture && 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s1->format == s2->format && 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (s1->texture->target != PIPE_BUFFER || 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (s1->u.buf.first_element == s2->u.buf.first_element && 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s1->u.buf.last_element == s2->u.buf.last_element)) && 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (s1->texture->target == PIPE_BUFFER || 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (s1->u.tex.level == s2->u.tex.level && 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s1->u.tex.first_layer == s2->u.tex.first_layer && 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s1->u.tex.last_layer == s2->u.tex.last_layer)); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convenience wrappers for screen buffer functions. 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct pipe_resource * 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_create( struct pipe_screen *screen, 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind, 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size ) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource buffer; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&buffer, 0, sizeof buffer); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.target = PIPE_BUFFER; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.format = PIPE_FORMAT_R8_UNORM; /* want TYPELESS or similar */ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.bind = bind; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.usage = usage; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.flags = 0; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.width0 = size; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.height0 = 1; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.depth0 = 1; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer.array_size = 1; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return screen->resource_create(screen, &buffer); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void * 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_map_range(struct pipe_context *pipe, 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buffer, 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned length, 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer **transfer) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *map; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(offset < buffer->width0); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(offset + length <= buffer->width0); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(length); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_1d(offset, length, &box); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *transfer = pipe->get_transfer( pipe, 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer, 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &box); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*transfer == NULL) 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = pipe->transfer_map( pipe, *transfer ); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (map == NULL) { 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy( pipe, *transfer ); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *transfer = NULL; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void * 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_map(struct pipe_context *pipe, 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buffer, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer **transfer) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pipe_buffer_map_range(pipe, buffer, 0, buffer->width0, usage, transfer); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_unmap(struct pipe_context *pipe, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer) 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (transfer) { 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_unmap(pipe, transfer); 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_destroy(pipe, transfer); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_flush_mapped_range(struct pipe_context *pipe, 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer, 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned length) 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int transfer_offset; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(length); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(transfer->box.x <= offset); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(offset + length <= transfer->box.x + transfer->box.width); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Match old screen->buffer_flush_mapped_range() behaviour, where 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * offset parameter is relative to the start of the buffer, not the 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapped range. 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer_offset = offset - transfer->box.x; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_1d(transfer_offset, length, &box); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_flush_region(pipe, transfer, &box); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_write(struct pipe_context *pipe, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buf, 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *data) 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage = PIPE_TRANSFER_WRITE; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offset == 0 && size == buf->width0) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage |= PIPE_TRANSFER_DISCARD_RANGE; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_1d(offset, size, &box); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_inline_write( pipe, 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage, 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &box, 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data, 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special case for writing non-overlapping ranges. 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We can avoid GPU/CPU synchronization when writing range that has never 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * been written before. 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_write_nooverlap(struct pipe_context *pipe, 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buf, 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, unsigned size, 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *data) 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_1d(offset, size, &box); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->transfer_inline_write(pipe, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (PIPE_TRANSFER_WRITE | 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_UNSYNCHRONIZED), 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &box, 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data, 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct pipe_resource * 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_create_with_data(struct pipe_context *pipe, 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind, 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned usage, 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *ptr) 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *res = pipe_buffer_create(pipe->screen, 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind, usage, size); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_write_nooverlap(pipe, res, 0, size, ptr); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_buffer_read(struct pipe_context *pipe, 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buf, 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offset, 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *data) 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *src_transfer; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ubyte *map; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map = (ubyte *) pipe_buffer_map_range(pipe, 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buf, 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset, size, 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_READ, 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &src_transfer); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (map) 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(data, map, size); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_buffer_unmap(pipe, src_transfer); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct pipe_transfer * 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_get_transfer( struct pipe_context *context, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *resource, 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned level, unsigned layer, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_transfer_usage usage, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned w, unsigned h) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_box_2d_zslice( x, y, layer, w, h, &box ); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return context->get_transfer( context, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource, 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level, 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &box ); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void * 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_transfer_map( struct pipe_context *context, 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer ) 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return context->transfer_map( context, transfer ); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_transfer_unmap( struct pipe_context *context, 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer ) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context->transfer_unmap( context, transfer ); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_transfer_destroy( struct pipe_context *context, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer ) 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org context->transfer_destroy(context, transfer); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpipe_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index, 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *buf) 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buf) { 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_constant_buffer cb; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cb.buffer = buf; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cb.buffer_offset = 0; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cb.buffer_size = buf->width0; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cb.user_buffer = NULL; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_constant_buffer(pipe, shader, index, &cb); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe->set_constant_buffer(pipe, shader, index, NULL); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean util_get_offset( 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_rasterizer_state *templ, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned fill_mode) 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(fill_mode) { 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_POLYGON_MODE_POINT: 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return templ->offset_point; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_POLYGON_MODE_LINE: 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return templ->offset_line; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_POLYGON_MODE_FILL: 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return templ->offset_tri; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used to copy an array of pipe_vertex_buffer structures, 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * while properly referencing the pipe_vertex_buffer::buffer member. 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa util_copy_framebuffer_state 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void util_copy_vertex_buffers(struct pipe_vertex_buffer *dst, 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *dst_count, 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_vertex_buffer *src, 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_count) 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Reference the buffers of 'src' in 'dst'. */ 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < src_count; i++) { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&dst[i].buffer, src[i].buffer); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unreference the rest of the buffers in 'dst'. */ 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (; i < *dst_count; i++) { 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&dst[i].buffer, NULL); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Update the size of 'dst' and copy over the other members 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of pipe_vertex_buffer. */ 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst_count = src_count; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dst, src, src_count * sizeof(struct pipe_vertex_buffer)); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE float 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_get_min_point_size(const struct pipe_rasterizer_state *state) 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The point size should be clamped to this value at the rasterizer stage. 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return state->gl_rasterization_rules && 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !state->point_quad_rasterization && 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !state->point_smooth && 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !state->multisample ? 1.0f : 0.0f; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_query_clear_result(union pipe_query_result *result, unsigned type) 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_OCCLUSION_PREDICATE: 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_SO_OVERFLOW_PREDICATE: 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_GPU_FINISHED: 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result->b = FALSE; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_OCCLUSION_COUNTER: 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_TIMESTAMP: 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_TIME_ELAPSED: 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_PRIMITIVES_GENERATED: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_PRIMITIVES_EMITTED: 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org result->u64 = 0; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_SO_STATISTICS: 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&result->so_statistics, 0, sizeof(result->so_statistics)); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_TIMESTAMP_DISJOINT: 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&result->timestamp_disjoint, 0, sizeof(result->timestamp_disjoint)); 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_QUERY_PIPELINE_STATISTICS: 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&result->pipeline_statistics, 0, sizeof(result->pipeline_statistics)); 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Convert PIPE_TEXTURE_x to TGSI_TEXTURE_x */ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_pipe_tex_to_tgsi_tex(enum pipe_texture_target pipe_tex_target, 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_samples) 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pipe_tex_target) { 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr_samples <= 1); 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TGSI_TEXTURE_1D; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nr_samples > 1 ? TGSI_TEXTURE_2D_MSAA : TGSI_TEXTURE_2D; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr_samples <= 1); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TGSI_TEXTURE_RECT; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr_samples <= 1); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TGSI_TEXTURE_3D; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr_samples <= 1); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TGSI_TEXTURE_CUBE; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nr_samples <= 1); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TGSI_TEXTURE_1D_ARRAY; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nr_samples > 1 ? TGSI_TEXTURE_2D_ARRAY_MSAA : 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_TEXTURE_2D_ARRAY; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "unexpected texture target"); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TGSI_TEXTURE_UNKNOWN; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* U_INLINES_H */ 609