1bf215546Sopenharmony_ci/**************************************************************************
2bf215546Sopenharmony_ci *
3bf215546Sopenharmony_ci * Copyright 2007 VMware, Inc.
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
16bf215546Sopenharmony_ci * of the Software.
17bf215546Sopenharmony_ci *
18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21bf215546Sopenharmony_ci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22bf215546Sopenharmony_ci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23bf215546Sopenharmony_ci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24bf215546Sopenharmony_ci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci **************************************************************************/
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci/* Authors:  Keith Whitwell <keithw@vmware.com>
29bf215546Sopenharmony_ci */
30bf215546Sopenharmony_ci
31bf215546Sopenharmony_ci#include "sp_context.h"
32bf215546Sopenharmony_ci#include "sp_state.h"
33bf215546Sopenharmony_ci#include "sp_tile_cache.h"
34bf215546Sopenharmony_ci
35bf215546Sopenharmony_ci#include "draw/draw_context.h"
36bf215546Sopenharmony_ci
37bf215546Sopenharmony_ci#include "util/format/u_format.h"
38bf215546Sopenharmony_ci#include "util/u_inlines.h"
39bf215546Sopenharmony_ci
40bf215546Sopenharmony_ci
41bf215546Sopenharmony_ci/**
42bf215546Sopenharmony_ci * XXX this might get moved someday
43bf215546Sopenharmony_ci * Set the framebuffer surface info: color buffers, zbuffer, stencil buffer.
44bf215546Sopenharmony_ci * Here, we flush the old surfaces and update the tile cache to point to the new
45bf215546Sopenharmony_ci * surfaces.
46bf215546Sopenharmony_ci */
47bf215546Sopenharmony_civoid
48bf215546Sopenharmony_cisoftpipe_set_framebuffer_state(struct pipe_context *pipe,
49bf215546Sopenharmony_ci                               const struct pipe_framebuffer_state *fb)
50bf215546Sopenharmony_ci{
51bf215546Sopenharmony_ci   struct softpipe_context *sp = softpipe_context(pipe);
52bf215546Sopenharmony_ci   uint i;
53bf215546Sopenharmony_ci
54bf215546Sopenharmony_ci   draw_flush(sp->draw);
55bf215546Sopenharmony_ci
56bf215546Sopenharmony_ci   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
57bf215546Sopenharmony_ci      struct pipe_surface *cb = i < fb->nr_cbufs ? fb->cbufs[i] : NULL;
58bf215546Sopenharmony_ci
59bf215546Sopenharmony_ci      /* check if changing cbuf */
60bf215546Sopenharmony_ci      if (sp->framebuffer.cbufs[i] != cb) {
61bf215546Sopenharmony_ci         /* flush old */
62bf215546Sopenharmony_ci         sp_flush_tile_cache(sp->cbuf_cache[i]);
63bf215546Sopenharmony_ci
64bf215546Sopenharmony_ci         /* assign new */
65bf215546Sopenharmony_ci         pipe_surface_reference(&sp->framebuffer.cbufs[i], cb);
66bf215546Sopenharmony_ci
67bf215546Sopenharmony_ci         /* update cache */
68bf215546Sopenharmony_ci         sp_tile_cache_set_surface(sp->cbuf_cache[i], cb);
69bf215546Sopenharmony_ci      }
70bf215546Sopenharmony_ci   }
71bf215546Sopenharmony_ci
72bf215546Sopenharmony_ci   sp->framebuffer.nr_cbufs = fb->nr_cbufs;
73bf215546Sopenharmony_ci
74bf215546Sopenharmony_ci   /* zbuf changing? */
75bf215546Sopenharmony_ci   if (sp->framebuffer.zsbuf != fb->zsbuf) {
76bf215546Sopenharmony_ci      /* flush old */
77bf215546Sopenharmony_ci      sp_flush_tile_cache(sp->zsbuf_cache);
78bf215546Sopenharmony_ci
79bf215546Sopenharmony_ci      /* assign new */
80bf215546Sopenharmony_ci      pipe_surface_reference(&sp->framebuffer.zsbuf, fb->zsbuf);
81bf215546Sopenharmony_ci
82bf215546Sopenharmony_ci      /* update cache */
83bf215546Sopenharmony_ci      sp_tile_cache_set_surface(sp->zsbuf_cache, fb->zsbuf);
84bf215546Sopenharmony_ci
85bf215546Sopenharmony_ci      /* Tell draw module how deep the Z/depth buffer is
86bf215546Sopenharmony_ci       *
87bf215546Sopenharmony_ci       * If no depth buffer is bound, send the utility function the
88bf215546Sopenharmony_ci       * format for no bound depth (PIPE_FORMAT_NONE).
89bf215546Sopenharmony_ci       */
90bf215546Sopenharmony_ci      draw_set_zs_format(sp->draw,
91bf215546Sopenharmony_ci                         (sp->framebuffer.zsbuf) ?
92bf215546Sopenharmony_ci                            sp->framebuffer.zsbuf->format : PIPE_FORMAT_NONE);
93bf215546Sopenharmony_ci   }
94bf215546Sopenharmony_ci
95bf215546Sopenharmony_ci   sp->framebuffer.width = fb->width;
96bf215546Sopenharmony_ci   sp->framebuffer.height = fb->height;
97bf215546Sopenharmony_ci   sp->framebuffer.samples = fb->samples;
98bf215546Sopenharmony_ci   sp->framebuffer.layers = fb->layers;
99bf215546Sopenharmony_ci
100bf215546Sopenharmony_ci   sp->dirty |= SP_NEW_FRAMEBUFFER | SP_NEW_TEXTURE;
101bf215546Sopenharmony_ci}
102