1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2012 Red Hat Inc.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software.
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: Ben Skeggs
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau/nouveau_gldefs.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nouveau/nv_object.xml.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv30-40_3d.xml.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv30_context.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv30_format.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint32_t
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpack_rgba(enum pipe_format format, const float *rgba)
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union util_color uc;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_pack_color(rgba, format, &uc);
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return uc.ui;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint32_t
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpack_zeta(enum pipe_format format, double depth, unsigned stencil)
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t zuint = (uint32_t)(depth * 4294967295.0);
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (format != PIPE_FORMAT_Z16_UNORM)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return (zuint & 0xffffff00) | (stencil & 0xff);
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return zuint >> 16;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv30_clear(struct pipe_context *pipe, unsigned buffers,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           const union pipe_color_union *color, double depth, unsigned stencil)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_context *nv30 = nv30_context(pipe);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = nv30->base.pushbuf;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_framebuffer_state *fb = &nv30->framebuffer;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t colr = 0, zeta = 0, mode = 0;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!nv30_state_validate(nv30, TRUE))
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      colr  = pack_rgba(fb->cbufs[0]->format, color->f);
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mode |= NV30_3D_CLEAR_BUFFERS_COLOR_R |
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              NV30_3D_CLEAR_BUFFERS_COLOR_G |
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              NV30_3D_CLEAR_BUFFERS_COLOR_B |
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              NV30_3D_CLEAR_BUFFERS_COLOR_A;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fb->zsbuf) {
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zeta = pack_zeta(fb->zsbuf->format, depth, stencil);
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (buffers & PIPE_CLEAR_DEPTH)
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mode |= NV30_3D_CLEAR_BUFFERS_DEPTH;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (buffers & PIPE_CLEAR_STENCIL)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mode |= NV30_3D_CLEAR_BUFFERS_STENCIL;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*XXX: wtf? fixes clears sometimes not clearing on nv3x... */
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nv30->screen->eng3d->oclass < NV40_3D_CLASS) {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BEGIN_NV04(push, NV30_3D(CLEAR_DEPTH_VALUE), 3);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, zeta);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, colr);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, mode);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(CLEAR_DEPTH_VALUE), 3);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, zeta);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, colr);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, mode);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nv30_state_release(nv30);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv30_clear_render_target(struct pipe_context *pipe, struct pipe_surface *ps,
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const union pipe_color_union *color,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned x, unsigned y, unsigned w, unsigned h)
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_context *nv30 = nv30_context(pipe);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_surface *sf = nv30_surface(ps);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_miptree *mt = nv30_miptree(ps->texture);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = nv30->base.pushbuf;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_object *eng3d = nv30->screen->eng3d;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf_refn refn;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t rt_format;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rt_format = nv30_format(pipe->screen, ps->format)->hw;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (util_format_get_blocksize(ps->format) == 4)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_ZETA_Z24S8;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_ZETA_Z16;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nv30_miptree(ps->texture)->swizzled) {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_TYPE_SWIZZLED;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= util_logbase2(sf->width) << 16;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= util_logbase2(sf->height) << 24;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_TYPE_LINEAR;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   refn.bo = mt->base.bo;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   refn.flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nouveau_pushbuf_space(push, 16, 1, 0) ||
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       nouveau_pushbuf_refn (push, &refn, 1))
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(RT_ENABLE), 1);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, NV30_3D_RT_ENABLE_COLOR0);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(RT_HORIZ), 3);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, sf->width << 16);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, sf->height << 16);
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, rt_format);
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(COLOR0_PITCH), 2);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (eng3d->oclass < NV40_3D_CLASS)
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, (sf->pitch << 16) | sf->pitch);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, sf->pitch);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_RELOC(push, mt->base.bo, sf->offset, NOUVEAU_BO_LOW, 0, 0);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(SCISSOR_HORIZ), 2);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, (w << 16) | x);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, (h << 16) | y);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(CLEAR_COLOR_VALUE), 2);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, pack_rgba(ps->format, color->f));
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, NV30_3D_CLEAR_BUFFERS_COLOR_R |
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    NV30_3D_CLEAR_BUFFERS_COLOR_G |
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    NV30_3D_CLEAR_BUFFERS_COLOR_B |
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    NV30_3D_CLEAR_BUFFERS_COLOR_A);
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nv30->dirty |= NV30_NEW_FRAMEBUFFER | NV30_NEW_SCISSOR;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv30_clear_depth_stencil(struct pipe_context *pipe, struct pipe_surface *ps,
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned buffers, double depth, unsigned stencil,
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned x, unsigned y, unsigned w, unsigned h)
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_context *nv30 = nv30_context(pipe);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_surface *sf = nv30_surface(ps);
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv30_miptree *mt = nv30_miptree(ps->texture);
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf *push = nv30->base.pushbuf;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_object *eng3d = nv30->screen->eng3d;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nouveau_pushbuf_refn refn;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t rt_format, mode = 0;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rt_format = nv30_format(pipe->screen, ps->format)->hw;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (util_format_get_blocksize(ps->format) == 4)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_COLOR_A8R8G8B8;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_COLOR_R5G6B5;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nv30_miptree(ps->texture)->swizzled) {
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_TYPE_SWIZZLED;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= util_logbase2(sf->width) << 16;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= util_logbase2(sf->height) << 24;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rt_format |= NV30_3D_RT_FORMAT_TYPE_LINEAR;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffers & PIPE_CLEAR_DEPTH)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mode |= NV30_3D_CLEAR_BUFFERS_DEPTH;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffers & PIPE_CLEAR_STENCIL)
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mode |= NV30_3D_CLEAR_BUFFERS_STENCIL;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   refn.bo = mt->base.bo;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   refn.flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_WR;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nouveau_pushbuf_space(push, 32, 1, 0) ||
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       nouveau_pushbuf_refn (push, &refn, 1))
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(RT_ENABLE), 1);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, 0);
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(RT_HORIZ), 3);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, sf->width << 16);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, sf->height << 16);
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, rt_format);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (eng3d->oclass < NV40_3D_CLASS) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BEGIN_NV04(push, NV30_3D(COLOR0_PITCH), 1);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, (sf->pitch << 16) | sf->pitch);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BEGIN_NV04(push, NV40_3D(ZETA_PITCH), 1);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PUSH_DATA (push, sf->pitch);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(ZETA_OFFSET), 1);
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_RELOC(push, mt->base.bo, sf->offset, NOUVEAU_BO_LOW, 0, 0);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(SCISSOR_HORIZ), 2);
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, (w << 16) | x);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, (h << 16) | y);
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(CLEAR_DEPTH_VALUE), 1);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, pack_zeta(ps->format, depth, stencil));
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BEGIN_NV04(push, NV30_3D(CLEAR_BUFFERS), 1);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PUSH_DATA (push, mode);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nv30->dirty |= NV30_NEW_FRAMEBUFFER | NV30_NEW_SCISSOR;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv30_clear_init(struct pipe_context *pipe)
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe->clear = nv30_clear;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe->clear_render_target = nv30_clear_render_target;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe->clear_depth_stencil = nv30_clear_depth_stencil;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
227