Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/**************************************************************************
2
 *
3
 * Copyright 2009-2010 VMware, Inc.  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
/**
28
 * @file
29
 * Framebuffer utility functions.
30
 *
31
 * @author Brian Paul
32
 */
33
 
34
 
35
#include "pipe/p_screen.h"
36
#include "pipe/p_state.h"
37
#include "pipe/p_defines.h"
38
#include "util/u_inlines.h"
39
 
40
#include "util/u_memory.h"
41
#include "util/u_framebuffer.h"
42
 
43
 
44
/**
45
 * Compare pipe_framebuffer_state objects.
46
 * \return TRUE if same, FALSE if different
47
 */
48
boolean
49
util_framebuffer_state_equal(const struct pipe_framebuffer_state *dst,
50
                             const struct pipe_framebuffer_state *src)
51
{
52
   unsigned i;
53
 
54
   if (dst->width != src->width ||
55
       dst->height != src->height)
56
      return FALSE;
57
 
58
   for (i = 0; i < Elements(src->cbufs); i++) {
59
      if (dst->cbufs[i] != src->cbufs[i]) {
60
         return FALSE;
61
      }
62
   }
63
 
64
   if (dst->nr_cbufs != src->nr_cbufs) {
65
      return FALSE;
66
   }
67
 
68
   if (dst->zsbuf != src->zsbuf) {
69
      return FALSE;
70
   }
71
 
72
   return TRUE;
73
}
74
 
75
 
76
/**
77
 * Copy framebuffer state from src to dst, updating refcounts.
78
 */
79
void
80
util_copy_framebuffer_state(struct pipe_framebuffer_state *dst,
81
                            const struct pipe_framebuffer_state *src)
82
{
83
   unsigned i;
84
 
85
   dst->width = src->width;
86
   dst->height = src->height;
87
 
88
   for (i = 0; i < src->nr_cbufs; i++)
89
      pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]);
90
 
91
   for (i = src->nr_cbufs; i < dst->nr_cbufs; i++)
92
      pipe_surface_reference(&dst->cbufs[i], NULL);
93
 
94
   dst->nr_cbufs = src->nr_cbufs;
95
 
96
   pipe_surface_reference(&dst->zsbuf, src->zsbuf);
97
}
98
 
99
 
100
void
101
util_unreference_framebuffer_state(struct pipe_framebuffer_state *fb)
102
{
103
   unsigned i;
104
 
105
   for (i = 0; i < fb->nr_cbufs; i++) {
106
      pipe_surface_reference(&fb->cbufs[i], NULL);
107
   }
108
 
109
   pipe_surface_reference(&fb->zsbuf, NULL);
110
 
111
   fb->width = fb->height = 0;
112
   fb->nr_cbufs = 0;
113
}
114
 
115
 
116
/* Where multiple sizes are allowed for framebuffer surfaces, find the
117
 * minimum width and height of all bound surfaces.
118
 */
119
boolean
120
util_framebuffer_min_size(const struct pipe_framebuffer_state *fb,
121
                          unsigned *width,
122
                          unsigned *height)
123
{
124
   unsigned w = ~0;
125
   unsigned h = ~0;
126
   unsigned i;
127
 
128
   for (i = 0; i < fb->nr_cbufs; i++) {
129
      w = MIN2(w, fb->cbufs[i]->width);
130
      h = MIN2(h, fb->cbufs[i]->height);
131
   }
132
 
133
   if (fb->zsbuf) {
134
      w = MIN2(w, fb->zsbuf->width);
135
      h = MIN2(h, fb->zsbuf->height);
136
   }
137
 
138
   if (w == ~0) {
139
      *width = 0;
140
      *height = 0;
141
      return FALSE;
142
   }
143
   else {
144
      *width = w;
145
      *height = h;
146
      return TRUE;
147
   }
148
}