1fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri/************************************************************************** 2fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * 3fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * Copyright 2010 Luca Barbieri 4fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * 5fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * Permission is hereby granted, free of charge, to any person obtaining 6fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * a copy of this software and associated documentation files (the 7fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * "Software"), to deal in the Software without restriction, including 8fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * without limitation the rights to use, copy, modify, merge, publish, 9fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to 10fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * permit persons to whom the Software is furnished to do so, subject to 11fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * the following conditions: 12fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * 13fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * The above copyright notice and this permission notice (including the 14fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * next paragraph) shall be included in all copies or substantial 15fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * portions of the Software. 16fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * 17fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * 25fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri **************************************************************************/ 26fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri 27ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri#ifndef U_SURFACES_H_ 28ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri#define U_SURFACES_H_ 29ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 30ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri#include "pipe/p_compiler.h" 31ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri#include "pipe/p_state.h" 32ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri#include "util/u_atomic.h" 33e45b2ce2c3a52e9f8e6fb7e933ab2f95eec15be1Luca Barbieri#include "cso_cache/cso_hash.h" 34ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 35ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieristruct util_surfaces 36ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri{ 37ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri union 38ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri { 39e45b2ce2c3a52e9f8e6fb7e933ab2f95eec15be1Luca Barbieri struct cso_hash *hash; 40ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri struct pipe_surface **array; 415668526c915a1e31036386d117c536592dae6859Luca Barbieri void* pv; 42ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri } u; 43ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri}; 44ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 45af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry/* Return value indicates if the pipe surface result is new */ 46af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantryboolean 47af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantryutil_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size, 48e3256ccb045032960f099318938991392b896b44Xavier Chantry struct pipe_context *ctx, struct pipe_resource *pt, 49af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry unsigned level, unsigned layer, unsigned flags, 50af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry struct pipe_surface **res); 51ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 52ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri/* fast inline path for the very common case */ 53af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantrystatic INLINE boolean 54af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantryutil_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size, 55e3256ccb045032960f099318938991392b896b44Xavier Chantry struct pipe_context *ctx, struct pipe_resource *pt, 56af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry unsigned level, unsigned layer, unsigned flags, 57af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry struct pipe_surface **res) 58ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri{ 59ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri if(likely((pt->target == PIPE_TEXTURE_2D || pt->target == PIPE_TEXTURE_RECT) && us->u.array)) 60ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri { 61ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri struct pipe_surface *ps = us->u.array[level]; 62e3256ccb045032960f099318938991392b896b44Xavier Chantry if(ps && ps->context == ctx) 63ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri { 64ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri p_atomic_inc(&ps->reference.count); 65af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry *res = ps; 66af5345d9371e927019d51ce3ad198958f8cd42a9Xavier Chantry return FALSE; 67ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri } 68ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri } 69ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 70e3256ccb045032960f099318938991392b896b44Xavier Chantry return util_surfaces_do_get(us, surface_struct_size, ctx, pt, level, layer, flags, res); 71ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri} 72ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 735668526c915a1e31036386d117c536592dae6859Luca Barbieristatic INLINE struct pipe_surface * 744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheideggerutil_surfaces_peek(struct util_surfaces *us, struct pipe_resource *pt, unsigned level, unsigned layer) 755668526c915a1e31036386d117c536592dae6859Luca Barbieri{ 765668526c915a1e31036386d117c536592dae6859Luca Barbieri if(!us->u.pv) 775668526c915a1e31036386d117c536592dae6859Luca Barbieri return 0; 785668526c915a1e31036386d117c536592dae6859Luca Barbieri 795668526c915a1e31036386d117c536592dae6859Luca Barbieri if(unlikely(pt->target == PIPE_TEXTURE_3D || pt->target == PIPE_TEXTURE_CUBE)) 804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger return cso_hash_iter_data(cso_hash_find(us->u.hash, (layer << 8) | level)); 815668526c915a1e31036386d117c536592dae6859Luca Barbieri else 825668526c915a1e31036386d117c536592dae6859Luca Barbieri return us->u.array[level]; 835668526c915a1e31036386d117c536592dae6859Luca Barbieri} 845668526c915a1e31036386d117c536592dae6859Luca Barbieri 85ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbierivoid util_surfaces_do_detach(struct util_surfaces *us, struct pipe_surface *ps); 86ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 87ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieristatic INLINE void 88ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieriutil_surfaces_detach(struct util_surfaces *us, struct pipe_surface *ps) 89ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri{ 90ae0ef6f69f351cacdc7eaa9b21097a7c1b414e44Luca Barbieri if(likely(ps->texture->target == PIPE_TEXTURE_2D || ps->texture->target == PIPE_TEXTURE_RECT)) 91ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri { 924c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger us->u.array[ps->u.tex.level] = 0; 93ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri return; 94ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri } 95ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 96d022bddf24b0f842ae96cf04a827e8995ac04e92Brian Paul util_surfaces_do_detach(us, ps); 97ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri} 98ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 99ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbierivoid util_surfaces_destroy(struct util_surfaces *us, struct pipe_resource *pt, void (*destroy_surface) (struct pipe_surface *)); 100ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri 101ac4b8db62d056fa5b85661f67ba5e1d1d29e3fcfLuca Barbieri#endif 102