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