* [PATCH] nv50, nvc0: don't crash on a null cbuf
@ 2014-01-15 7:30 Ilia Mirkin
[not found] ` <1389771040-29447-1-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
0 siblings, 1 reply; 10+ messages in thread
From: Ilia Mirkin @ 2014-01-15 7:30 UTC (permalink / raw)
To: Christoph Bumiller, mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
This is needed since commit 9baa45f78b (st/mesa: bind NULL colorbuffers
as specified by glDrawBuffers).
Signed-off-by: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
---
Not sure whether something needs to be done to clear out the old RT_* settings
for that index buffer, or if things are cleared out implicitly. Perhaps
instead of skipping indices, RT_CONTROL needs to be adjusted with the
appropriate indices?
src/gallium/drivers/nouveau/nv50/nv50_state_validate.c | 14 +++++++++++---
src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c | 14 +++++++++++---
2 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
index 86b9a23..7d330c9 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c
@@ -20,9 +20,17 @@ nv50_validate_fb(struct nv50_context *nv50)
PUSH_DATA (push, fb->height << 16);
for (i = 0; i < fb->nr_cbufs; ++i) {
- struct nv50_miptree *mt = nv50_miptree(fb->cbufs[i]->texture);
- struct nv50_surface *sf = nv50_surface(fb->cbufs[i]);
- struct nouveau_bo *bo = mt->base.bo;
+ struct nv50_miptree *mt;
+ struct nv50_surface *sf;
+ struct nouveau_bo *bo;
+
+ /* Do we need to clear the old RT settings? */
+ if (!fb->cbufs[i])
+ continue;
+
+ mt = nv50_miptree(fb->cbufs[i]->texture);
+ sf = nv50_surface(fb->cbufs[i]);
+ bo = mt->base.bo;
array_size = MIN2(array_size, sf->depth);
if (mt->layout_3d)
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
index 0ba4bad..9059d76 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
@@ -72,9 +72,17 @@ nvc0_validate_fb(struct nvc0_context *nvc0)
PUSH_DATA (push, fb->height << 16);
for (i = 0; i < fb->nr_cbufs; ++i) {
- struct nv50_surface *sf = nv50_surface(fb->cbufs[i]);
- struct nv04_resource *res = nv04_resource(sf->base.texture);
- struct nouveau_bo *bo = res->bo;
+ struct nv50_surface *sf;
+ struct nv04_resource *res;
+ struct nouveau_bo *bo;
+
+ /* Do we need to clear the old RT settings? */
+ if (!fb->cbufs[i])
+ continue;
+
+ sf = nv50_surface(fb->cbufs[i]);
+ res = nv04_resource(sf->base.texture);
+ bo = res->bo;
BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 9);
PUSH_DATAh(push, res->address + sf->offset);
--
1.8.3.2
^ permalink raw reply related [flat|nested] 10+ messages in thread[parent not found: <1389771040-29447-1-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>]
* [PATCH v2] nv50, nvc0: clear out RT on a null cbuf [not found] ` <1389771040-29447-1-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> @ 2014-01-17 2:23 ` Ilia Mirkin 2014-01-17 2:23 ` [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear Ilia Mirkin 2014-01-23 19:40 ` [Nouveau] [PATCH v2] nv50, nvc0: clear out RT on a null cbuf Emil Velikov 0 siblings, 2 replies; 10+ messages in thread From: Ilia Mirkin @ 2014-01-17 2:23 UTC (permalink / raw) To: mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW This is needed since commit 9baa45f78b (st/mesa: bind NULL colorbuffers as specified by glDrawBuffers). This implementation is highly based on a larger commit by Christoph Bumiller <e0425955-oe7qfRrRQffzPE21tAIdciO7C/xPubJB@public.gmane.org> in his gallium-nine branch. Signed-off-by: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> --- src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h | 1 + src/gallium/drivers/nouveau/nv50/nv50_formats.c | 1 - .../drivers/nouveau/nv50/nv50_state_validate.c | 30 +++++++++++++++++++--- .../drivers/nouveau/nvc0/nvc0_state_validate.c | 28 +++++++++++++++++--- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h b/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h index 2e42843..80de3be 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h +++ b/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h @@ -78,6 +78,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define NV50_VSTATUS_BLOCKED 0x00000005 #define NV50_VSTATUS_FAULTED 0x00000006 #define NV50_VSTATUS_PAUSED 0x00000007 +#define NV50_SURFACE_FORMAT_NONE 0x00000000 #define NV50_SURFACE_FORMAT_BITMAP 0x0000001c #define NV50_SURFACE_FORMAT_UNK1D 0x0000001d #define NV50_SURFACE_FORMAT_RGBA32_FLOAT 0x000000c0 diff --git a/src/gallium/drivers/nouveau/nv50/nv50_formats.c b/src/gallium/drivers/nouveau/nv50/nv50_formats.c index 0a7e812..d21905d 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_formats.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_formats.c @@ -71,7 +71,6 @@ # define U_tV U_V #endif -#define NV50_SURFACE_FORMAT_NONE 0 #define NV50_ZETA_FORMAT_NONE 0 /* for vertex buffers: */ diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c index 86b9a23..bb05f03 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c @@ -1,6 +1,19 @@ #include "nv50/nv50_context.h" -#include "os/os_time.h" +#include "nv50/nv50_defs.xml.h" + +static INLINE void +nv50_fb_set_null_rt(struct nouveau_pushbuf *push, unsigned i) +{ + BEGIN_NV04(push, NV50_3D(RT_ADDRESS_HIGH(i)), 4); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + PUSH_DATA (push, NV50_SURFACE_FORMAT_NONE); + PUSH_DATA (push, 0); + BEGIN_NV04(push, NV50_3D(RT_HORIZ(i)), 2); + PUSH_DATA (push, 64); + PUSH_DATA (push, 0); +} static void nv50_validate_fb(struct nv50_context *nv50) @@ -20,9 +33,18 @@ nv50_validate_fb(struct nv50_context *nv50) PUSH_DATA (push, fb->height << 16); for (i = 0; i < fb->nr_cbufs; ++i) { - struct nv50_miptree *mt = nv50_miptree(fb->cbufs[i]->texture); - struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); - struct nouveau_bo *bo = mt->base.bo; + struct nv50_miptree *mt; + struct nv50_surface *sf; + struct nouveau_bo *bo; + + if (!fb->cbufs[i]) { + nv50_fb_set_null_rt(push, i); + continue; + } + + mt = nv50_miptree(fb->cbufs[i]->texture); + sf = nv50_surface(fb->cbufs[i]); + bo = mt->base.bo; array_size = MIN2(array_size, sf->depth); if (mt->layout_3d) diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c index 0ba4bad..dd71c65 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c @@ -2,6 +2,7 @@ #include "util/u_math.h" #include "nvc0/nvc0_context.h" +#include "nv50/nv50_defs.xml.h" #if 0 static void @@ -54,6 +55,18 @@ nvc0_validate_zcull(struct nvc0_context *nvc0) } #endif +static INLINE void +nvc0_fb_set_null_rt(struct nouveau_pushbuf *push, unsigned i) +{ + BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 6); + PUSH_DATA (push, 0); + PUSH_DATA (push, 0); + PUSH_DATA (push, 64); + PUSH_DATA (push, 0); + PUSH_DATA (push, NV50_SURFACE_FORMAT_NONE); + PUSH_DATA (push, 0); +} + static void nvc0_validate_fb(struct nvc0_context *nvc0) { @@ -72,9 +85,18 @@ nvc0_validate_fb(struct nvc0_context *nvc0) PUSH_DATA (push, fb->height << 16); for (i = 0; i < fb->nr_cbufs; ++i) { - struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); - struct nv04_resource *res = nv04_resource(sf->base.texture); - struct nouveau_bo *bo = res->bo; + struct nv50_surface *sf; + struct nv04_resource *res; + struct nouveau_bo *bo; + + if (!fb->cbufs[i]) { + nvc0_fb_set_null_rt(push, i); + continue; + } + + sf = nv50_surface(fb->cbufs[i]); + res = nv04_resource(sf->base.texture); + bo = res->bo; BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 9); PUSH_DATAh(push, res->address + sf->offset); -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear 2014-01-17 2:23 ` [PATCH v2] nv50, nvc0: clear out RT " Ilia Mirkin @ 2014-01-17 2:23 ` Ilia Mirkin [not found] ` <1389925395-22379-2-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> 2014-01-23 19:40 ` [Nouveau] [PATCH v2] nv50, nvc0: clear out RT on a null cbuf Emil Velikov 1 sibling, 1 reply; 10+ messages in thread From: Ilia Mirkin @ 2014-01-17 2:23 UTC (permalink / raw) To: mesa-dev; +Cc: nouveau Fixes fbo-drawbuffers-none glClearBuffer piglit test. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> --- Only tested on nv50, but implementations seem similar enough. src/gallium/drivers/nouveau/nv50/nv50_surface.c | 17 +++++++++-------- src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index 358f57a..eb27429 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -408,9 +408,6 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, PUSH_DATAf(push, color->f[1]); PUSH_DATAf(push, color->f[2]); PUSH_DATAf(push, color->f[3]); - mode = - NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | - NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; } if (buffers & PIPE_CLEAR_DEPTH) { @@ -425,12 +422,16 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, mode |= NV50_3D_CLEAR_BUFFERS_S; } - BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); - PUSH_DATA (push, mode); - - for (i = 1; i < fb->nr_cbufs; i++) { + if (mode) { BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); - PUSH_DATA (push, (i << 6) | 0x3c); + PUSH_DATA (push, mode); + } + + for (i = 0; i < fb->nr_cbufs; i++) { + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { + BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); + PUSH_DATA (push, (i << 6) | 0x3c); + } } } diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c index 5375bd4..0c12bce 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c @@ -427,9 +427,6 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, PUSH_DATAf(push, color->f[1]); PUSH_DATAf(push, color->f[2]); PUSH_DATAf(push, color->f[3]); - mode = - NVC0_3D_CLEAR_BUFFERS_R | NVC0_3D_CLEAR_BUFFERS_G | - NVC0_3D_CLEAR_BUFFERS_B | NVC0_3D_CLEAR_BUFFERS_A; } if (buffers & PIPE_CLEAR_DEPTH) { @@ -444,12 +441,16 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, mode |= NVC0_3D_CLEAR_BUFFERS_S; } - BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); - PUSH_DATA (push, mode); - - for (i = 1; i < fb->nr_cbufs; i++) { + if (mode) { BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); - PUSH_DATA (push, (i << 6) | 0x3c); + PUSH_DATA (push, mode); + } + + for (i = 0; i < fb->nr_cbufs; i++) { + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { + BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); + PUSH_DATA (push, (i << 6) | 0x3c); + } } } -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 10+ messages in thread
[parent not found: <1389925395-22379-2-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>]
* Re: [Mesa-dev] [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear [not found] ` <1389925395-22379-2-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> @ 2014-01-23 20:11 ` Emil Velikov [not found] ` <52E17757.2010807-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 10+ messages in thread From: Emil Velikov @ 2014-01-23 20:11 UTC (permalink / raw) To: Ilia Mirkin, mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW On 17/01/14 02:23, Ilia Mirkin wrote: > Fixes fbo-drawbuffers-none glClearBuffer piglit test. > > Signed-off-by: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> > --- > > Only tested on nv50, but implementations seem similar enough. > > src/gallium/drivers/nouveau/nv50/nv50_surface.c | 17 +++++++++-------- > src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 17 +++++++++-------- > 2 files changed, 18 insertions(+), 16 deletions(-) > > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c > index 358f57a..eb27429 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c > @@ -408,9 +408,6 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, > PUSH_DATAf(push, color->f[1]); > PUSH_DATAf(push, color->f[2]); > PUSH_DATAf(push, color->f[3]); > - mode = > - NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | > - NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; > } > I'm not sure why you've dropped the mode from above. I'm guessing that the initial assumption was that if there is a color buffer it must be at cbuf[0]. The corrected version in your github branch looks alot better, it handles the above case and does not overwrite the clear buffer on rt0. That one is Reviewed-by: Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > if (buffers & PIPE_CLEAR_DEPTH) { > @@ -425,12 +422,16 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, > mode |= NV50_3D_CLEAR_BUFFERS_S; > } > > - BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); > - PUSH_DATA (push, mode); > - > - for (i = 1; i < fb->nr_cbufs; i++) { > + if (mode) { > BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); > - PUSH_DATA (push, (i << 6) | 0x3c); > + PUSH_DATA (push, mode); > + } > + > + for (i = 0; i < fb->nr_cbufs; i++) { > + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { > + BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); > + PUSH_DATA (push, (i << 6) | 0x3c); > + } > } > } > > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > index 5375bd4..0c12bce 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c > @@ -427,9 +427,6 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, > PUSH_DATAf(push, color->f[1]); > PUSH_DATAf(push, color->f[2]); > PUSH_DATAf(push, color->f[3]); > - mode = > - NVC0_3D_CLEAR_BUFFERS_R | NVC0_3D_CLEAR_BUFFERS_G | > - NVC0_3D_CLEAR_BUFFERS_B | NVC0_3D_CLEAR_BUFFERS_A; > } > > if (buffers & PIPE_CLEAR_DEPTH) { > @@ -444,12 +441,16 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, > mode |= NVC0_3D_CLEAR_BUFFERS_S; > } > > - BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); > - PUSH_DATA (push, mode); > - > - for (i = 1; i < fb->nr_cbufs; i++) { > + if (mode) { > BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); > - PUSH_DATA (push, (i << 6) | 0x3c); > + PUSH_DATA (push, mode); > + } > + > + for (i = 0; i < fb->nr_cbufs; i++) { > + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { > + BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); > + PUSH_DATA (push, (i << 6) | 0x3c); > + } > } > } > > ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <52E17757.2010807-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [Mesa-dev] [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear [not found] ` <52E17757.2010807-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2014-01-23 20:15 ` Ilia Mirkin 2014-01-23 20:31 ` Emil Velikov 0 siblings, 1 reply; 10+ messages in thread From: Ilia Mirkin @ 2014-01-23 20:15 UTC (permalink / raw) To: Emil Velikov Cc: mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org On Thu, Jan 23, 2014 at 3:11 PM, Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On 17/01/14 02:23, Ilia Mirkin wrote: >> Fixes fbo-drawbuffers-none glClearBuffer piglit test. >> >> Signed-off-by: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> >> --- >> >> Only tested on nv50, but implementations seem similar enough. >> >> src/gallium/drivers/nouveau/nv50/nv50_surface.c | 17 +++++++++-------- >> src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 17 +++++++++-------- >> 2 files changed, 18 insertions(+), 16 deletions(-) >> >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c >> index 358f57a..eb27429 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c >> @@ -408,9 +408,6 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, >> PUSH_DATAf(push, color->f[1]); >> PUSH_DATAf(push, color->f[2]); >> PUSH_DATAf(push, color->f[3]); >> - mode = >> - NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | >> - NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; >> } >> > I'm not sure why you've dropped the mode from above. I'm guessing that > the initial assumption was that if there is a color buffer it must be at > cbuf[0]. Because I cleared the cbufs separately in a for loop below (the 0x3c == the RGBA mask). The first RT may not have been there, and that seemed simpler than the thing that I have now (as evidenced by the code I have now which has more complex logic). > > The corrected version in your github branch looks alot better, it > handles the above case and does not overwrite the clear buffer on rt0. Christoph was really keen on doing the common-case color/depth clear all in one clear buffers command, so yeah -- I redid it that way. Enjoy the layered version of that in a later commit. > > That one is Reviewed-by: Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> >> if (buffers & PIPE_CLEAR_DEPTH) { >> @@ -425,12 +422,16 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, >> mode |= NV50_3D_CLEAR_BUFFERS_S; >> } >> >> - BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); >> - PUSH_DATA (push, mode); >> - >> - for (i = 1; i < fb->nr_cbufs; i++) { >> + if (mode) { >> BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); >> - PUSH_DATA (push, (i << 6) | 0x3c); >> + PUSH_DATA (push, mode); >> + } >> + >> + for (i = 0; i < fb->nr_cbufs; i++) { >> + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { >> + BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); >> + PUSH_DATA (push, (i << 6) | 0x3c); >> + } >> } >> } >> >> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c >> index 5375bd4..0c12bce 100644 >> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c >> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c >> @@ -427,9 +427,6 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, >> PUSH_DATAf(push, color->f[1]); >> PUSH_DATAf(push, color->f[2]); >> PUSH_DATAf(push, color->f[3]); >> - mode = >> - NVC0_3D_CLEAR_BUFFERS_R | NVC0_3D_CLEAR_BUFFERS_G | >> - NVC0_3D_CLEAR_BUFFERS_B | NVC0_3D_CLEAR_BUFFERS_A; >> } >> >> if (buffers & PIPE_CLEAR_DEPTH) { >> @@ -444,12 +441,16 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, >> mode |= NVC0_3D_CLEAR_BUFFERS_S; >> } >> >> - BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); >> - PUSH_DATA (push, mode); >> - >> - for (i = 1; i < fb->nr_cbufs; i++) { >> + if (mode) { >> BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); >> - PUSH_DATA (push, (i << 6) | 0x3c); >> + PUSH_DATA (push, mode); >> + } >> + >> + for (i = 0; i < fb->nr_cbufs; i++) { >> + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { >> + BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); >> + PUSH_DATA (push, (i << 6) | 0x3c); >> + } >> } >> } >> >> > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear 2014-01-23 20:15 ` Ilia Mirkin @ 2014-01-23 20:31 ` Emil Velikov [not found] ` <52E17C0C.9050305-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 0 siblings, 1 reply; 10+ messages in thread From: Emil Velikov @ 2014-01-23 20:31 UTC (permalink / raw) To: Ilia Mirkin Cc: mesa-dev@lists.freedesktop.org, emil.l.velikov, nouveau@lists.freedesktop.org On 23/01/14 20:15, Ilia Mirkin wrote: > On Thu, Jan 23, 2014 at 3:11 PM, Emil Velikov <emil.l.velikov@gmail.com> wrote: >> On 17/01/14 02:23, Ilia Mirkin wrote: >>> Fixes fbo-drawbuffers-none glClearBuffer piglit test. >>> >>> Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> >>> --- >>> >>> Only tested on nv50, but implementations seem similar enough. >>> >>> src/gallium/drivers/nouveau/nv50/nv50_surface.c | 17 +++++++++-------- >>> src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 17 +++++++++-------- >>> 2 files changed, 18 insertions(+), 16 deletions(-) >>> >>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c >>> index 358f57a..eb27429 100644 >>> --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c >>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c >>> @@ -408,9 +408,6 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, >>> PUSH_DATAf(push, color->f[1]); >>> PUSH_DATAf(push, color->f[2]); >>> PUSH_DATAf(push, color->f[3]); >>> - mode = >>> - NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | >>> - NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; >>> } >>> >> I'm not sure why you've dropped the mode from above. I'm guessing that >> the initial assumption was that if there is a color buffer it must be at >> cbuf[0]. > > Because I cleared the cbufs separately in a for loop below (the 0x3c > == the RGBA mask). The first RT may not have been there, and that > seemed simpler than the thing that I have now (as evidenced by the > code I have now which has more complex logic). > With the original patch, you explicitly set clear_depth and clear_stencil for the first buffer, regardless of what is being passed by gallium. I'm not sure that was strictly correct. -Emil >> >> The corrected version in your github branch looks alot better, it >> handles the above case and does not overwrite the clear buffer on rt0. > > Christoph was really keen on doing the common-case color/depth clear > all in one clear buffers command, so yeah -- I redid it that way. > Enjoy the layered version of that in a later commit. > >> >> That one is Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> >>> if (buffers & PIPE_CLEAR_DEPTH) { >>> @@ -425,12 +422,16 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, >>> mode |= NV50_3D_CLEAR_BUFFERS_S; >>> } >>> >>> - BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); >>> - PUSH_DATA (push, mode); >>> - >>> - for (i = 1; i < fb->nr_cbufs; i++) { >>> + if (mode) { >>> BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); >>> - PUSH_DATA (push, (i << 6) | 0x3c); >>> + PUSH_DATA (push, mode); >>> + } >>> + >>> + for (i = 0; i < fb->nr_cbufs; i++) { >>> + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { >>> + BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); >>> + PUSH_DATA (push, (i << 6) | 0x3c); >>> + } >>> } >>> } >>> >>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c >>> index 5375bd4..0c12bce 100644 >>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c >>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c >>> @@ -427,9 +427,6 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, >>> PUSH_DATAf(push, color->f[1]); >>> PUSH_DATAf(push, color->f[2]); >>> PUSH_DATAf(push, color->f[3]); >>> - mode = >>> - NVC0_3D_CLEAR_BUFFERS_R | NVC0_3D_CLEAR_BUFFERS_G | >>> - NVC0_3D_CLEAR_BUFFERS_B | NVC0_3D_CLEAR_BUFFERS_A; >>> } >>> >>> if (buffers & PIPE_CLEAR_DEPTH) { >>> @@ -444,12 +441,16 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, >>> mode |= NVC0_3D_CLEAR_BUFFERS_S; >>> } >>> >>> - BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); >>> - PUSH_DATA (push, mode); >>> - >>> - for (i = 1; i < fb->nr_cbufs; i++) { >>> + if (mode) { >>> BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); >>> - PUSH_DATA (push, (i << 6) | 0x3c); >>> + PUSH_DATA (push, mode); >>> + } >>> + >>> + for (i = 0; i < fb->nr_cbufs; i++) { >>> + if (buffers & (PIPE_CLEAR_COLOR0 << i)) { >>> + BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); >>> + PUSH_DATA (push, (i << 6) | 0x3c); >>> + } >>> } >>> } >>> >>> >> ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <52E17C0C.9050305-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [Mesa-dev] [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear [not found] ` <52E17C0C.9050305-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2014-01-23 20:33 ` Ilia Mirkin 0 siblings, 0 replies; 10+ messages in thread From: Ilia Mirkin @ 2014-01-23 20:33 UTC (permalink / raw) To: Emil Velikov Cc: mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org On Thu, Jan 23, 2014 at 3:31 PM, Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On 23/01/14 20:15, Ilia Mirkin wrote: >> On Thu, Jan 23, 2014 at 3:11 PM, Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >>> On 17/01/14 02:23, Ilia Mirkin wrote: >>>> Fixes fbo-drawbuffers-none glClearBuffer piglit test. >>>> >>>> Signed-off-by: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> >>>> --- >>>> >>>> Only tested on nv50, but implementations seem similar enough. >>>> >>>> src/gallium/drivers/nouveau/nv50/nv50_surface.c | 17 +++++++++-------- >>>> src/gallium/drivers/nouveau/nvc0/nvc0_surface.c | 17 +++++++++-------- >>>> 2 files changed, 18 insertions(+), 16 deletions(-) >>>> >>>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c >>>> index 358f57a..eb27429 100644 >>>> --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c >>>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c >>>> @@ -408,9 +408,6 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, >>>> PUSH_DATAf(push, color->f[1]); >>>> PUSH_DATAf(push, color->f[2]); >>>> PUSH_DATAf(push, color->f[3]); >>>> - mode = >>>> - NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | >>>> - NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; >>>> } >>>> >>> I'm not sure why you've dropped the mode from above. I'm guessing that >>> the initial assumption was that if there is a color buffer it must be at >>> cbuf[0]. >> >> Because I cleared the cbufs separately in a for loop below (the 0x3c >> == the RGBA mask). The first RT may not have been there, and that >> seemed simpler than the thing that I have now (as evidenced by the >> code I have now which has more complex logic). >> > With the original patch, you explicitly set clear_depth and > clear_stencil for the first buffer, regardless of what is being passed > by gallium. I'm not sure that was strictly correct. Only if buffers & PIPE_CLEAR_DEPTH/STENCIL were set... of which there can only be one, unlike the color buffers, of which there can be many. Well, whatever. I think everyone's happy with the new version, right? ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Nouveau] [PATCH v2] nv50, nvc0: clear out RT on a null cbuf 2014-01-17 2:23 ` [PATCH v2] nv50, nvc0: clear out RT " Ilia Mirkin 2014-01-17 2:23 ` [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear Ilia Mirkin @ 2014-01-23 19:40 ` Emil Velikov [not found] ` <52E1701A.3060203-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 1 sibling, 1 reply; 10+ messages in thread From: Emil Velikov @ 2014-01-23 19:40 UTC (permalink / raw) To: Ilia Mirkin, mesa-dev; +Cc: nouveau, emil.l.velikov On 17/01/14 02:23, Ilia Mirkin wrote: > This is needed since commit 9baa45f78b (st/mesa: bind NULL colorbuffers > as specified by glDrawBuffers). > > This implementation is highly based on a larger commit by > Christoph Bumiller <e0425955@student.tuwien.ac.at> in his gallium-nine > branch. > Ilia, Do you know why we cannot set the rt height to 64? After all you explicitly set the format to NONE. Either way this patch looks good afaics Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> > Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> > --- > src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h | 1 + > src/gallium/drivers/nouveau/nv50/nv50_formats.c | 1 - > .../drivers/nouveau/nv50/nv50_state_validate.c | 30 +++++++++++++++++++--- > .../drivers/nouveau/nvc0/nvc0_state_validate.c | 28 +++++++++++++++++--- > 4 files changed, 52 insertions(+), 8 deletions(-) > > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h b/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h > index 2e42843..80de3be 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h > +++ b/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h > @@ -78,6 +78,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. > #define NV50_VSTATUS_BLOCKED 0x00000005 > #define NV50_VSTATUS_FAULTED 0x00000006 > #define NV50_VSTATUS_PAUSED 0x00000007 > +#define NV50_SURFACE_FORMAT_NONE 0x00000000 > #define NV50_SURFACE_FORMAT_BITMAP 0x0000001c > #define NV50_SURFACE_FORMAT_UNK1D 0x0000001d > #define NV50_SURFACE_FORMAT_RGBA32_FLOAT 0x000000c0 > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_formats.c b/src/gallium/drivers/nouveau/nv50/nv50_formats.c > index 0a7e812..d21905d 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_formats.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_formats.c > @@ -71,7 +71,6 @@ > # define U_tV U_V > #endif > > -#define NV50_SURFACE_FORMAT_NONE 0 > #define NV50_ZETA_FORMAT_NONE 0 > > /* for vertex buffers: */ > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > index 86b9a23..bb05f03 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c > @@ -1,6 +1,19 @@ > > #include "nv50/nv50_context.h" > -#include "os/os_time.h" > +#include "nv50/nv50_defs.xml.h" > + > +static INLINE void > +nv50_fb_set_null_rt(struct nouveau_pushbuf *push, unsigned i) > +{ > + BEGIN_NV04(push, NV50_3D(RT_ADDRESS_HIGH(i)), 4); > + PUSH_DATA (push, 0); > + PUSH_DATA (push, 0); > + PUSH_DATA (push, NV50_SURFACE_FORMAT_NONE); > + PUSH_DATA (push, 0); > + BEGIN_NV04(push, NV50_3D(RT_HORIZ(i)), 2); > + PUSH_DATA (push, 64); > + PUSH_DATA (push, 0); > +} > > static void > nv50_validate_fb(struct nv50_context *nv50) > @@ -20,9 +33,18 @@ nv50_validate_fb(struct nv50_context *nv50) > PUSH_DATA (push, fb->height << 16); > > for (i = 0; i < fb->nr_cbufs; ++i) { > - struct nv50_miptree *mt = nv50_miptree(fb->cbufs[i]->texture); > - struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); > - struct nouveau_bo *bo = mt->base.bo; > + struct nv50_miptree *mt; > + struct nv50_surface *sf; > + struct nouveau_bo *bo; > + > + if (!fb->cbufs[i]) { > + nv50_fb_set_null_rt(push, i); > + continue; > + } > + > + mt = nv50_miptree(fb->cbufs[i]->texture); > + sf = nv50_surface(fb->cbufs[i]); > + bo = mt->base.bo; > > array_size = MIN2(array_size, sf->depth); > if (mt->layout_3d) > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > index 0ba4bad..dd71c65 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c > @@ -2,6 +2,7 @@ > #include "util/u_math.h" > > #include "nvc0/nvc0_context.h" > +#include "nv50/nv50_defs.xml.h" > > #if 0 > static void > @@ -54,6 +55,18 @@ nvc0_validate_zcull(struct nvc0_context *nvc0) > } > #endif > > +static INLINE void > +nvc0_fb_set_null_rt(struct nouveau_pushbuf *push, unsigned i) > +{ > + BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 6); > + PUSH_DATA (push, 0); > + PUSH_DATA (push, 0); > + PUSH_DATA (push, 64); > + PUSH_DATA (push, 0); > + PUSH_DATA (push, NV50_SURFACE_FORMAT_NONE); > + PUSH_DATA (push, 0); > +} > + > static void > nvc0_validate_fb(struct nvc0_context *nvc0) > { > @@ -72,9 +85,18 @@ nvc0_validate_fb(struct nvc0_context *nvc0) > PUSH_DATA (push, fb->height << 16); > > for (i = 0; i < fb->nr_cbufs; ++i) { > - struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); > - struct nv04_resource *res = nv04_resource(sf->base.texture); > - struct nouveau_bo *bo = res->bo; > + struct nv50_surface *sf; > + struct nv04_resource *res; > + struct nouveau_bo *bo; > + > + if (!fb->cbufs[i]) { > + nvc0_fb_set_null_rt(push, i); > + continue; > + } > + > + sf = nv50_surface(fb->cbufs[i]); > + res = nv04_resource(sf->base.texture); > + bo = res->bo; > > BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 9); > PUSH_DATAh(push, res->address + sf->offset); > ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <52E1701A.3060203-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH v2] nv50, nvc0: clear out RT on a null cbuf [not found] ` <52E1701A.3060203-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2014-01-23 19:39 ` Ilia Mirkin [not found] ` <CAKb7UvgB_5omfkrL1mfFUYHL_3Pi8V01NzJJeo2sbKTfuNYOkA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 10+ messages in thread From: Ilia Mirkin @ 2014-01-23 19:39 UTC (permalink / raw) To: Emil Velikov Cc: mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org On Thu, Jan 23, 2014 at 2:40 PM, Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On 17/01/14 02:23, Ilia Mirkin wrote: >> This is needed since commit 9baa45f78b (st/mesa: bind NULL colorbuffers >> as specified by glDrawBuffers). >> >> This implementation is highly based on a larger commit by >> Christoph Bumiller <e0425955-oe7qfRrRQffzPE21tAIdciO7C/xPubJB@public.gmane.org> in his gallium-nine >> branch. >> > Ilia, > Do you know why we cannot set the rt height to 64? After all you > explicitly set the format to NONE. Because then the RT would have a size, which we don't want. The real question is why not set the width to 0. It was that way in Christoph's code, I assumed he did it that way for a reason. > > Either way this patch looks good afaics > Reviewed-by: Emil Velikov <emil.l.velikov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> >> Signed-off-by: Ilia Mirkin <imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org> >> --- >> src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h | 1 + >> src/gallium/drivers/nouveau/nv50/nv50_formats.c | 1 - >> .../drivers/nouveau/nv50/nv50_state_validate.c | 30 +++++++++++++++++++--- >> .../drivers/nouveau/nvc0/nvc0_state_validate.c | 28 +++++++++++++++++--- >> 4 files changed, 52 insertions(+), 8 deletions(-) >> >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h b/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h >> index 2e42843..80de3be 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_defs.xml.h >> @@ -78,6 +78,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. >> #define NV50_VSTATUS_BLOCKED 0x00000005 >> #define NV50_VSTATUS_FAULTED 0x00000006 >> #define NV50_VSTATUS_PAUSED 0x00000007 >> +#define NV50_SURFACE_FORMAT_NONE 0x00000000 >> #define NV50_SURFACE_FORMAT_BITMAP 0x0000001c >> #define NV50_SURFACE_FORMAT_UNK1D 0x0000001d >> #define NV50_SURFACE_FORMAT_RGBA32_FLOAT 0x000000c0 >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_formats.c b/src/gallium/drivers/nouveau/nv50/nv50_formats.c >> index 0a7e812..d21905d 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_formats.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_formats.c >> @@ -71,7 +71,6 @@ >> # define U_tV U_V >> #endif >> >> -#define NV50_SURFACE_FORMAT_NONE 0 >> #define NV50_ZETA_FORMAT_NONE 0 >> >> /* for vertex buffers: */ >> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> index 86b9a23..bb05f03 100644 >> --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c >> @@ -1,6 +1,19 @@ >> >> #include "nv50/nv50_context.h" >> -#include "os/os_time.h" >> +#include "nv50/nv50_defs.xml.h" >> + >> +static INLINE void >> +nv50_fb_set_null_rt(struct nouveau_pushbuf *push, unsigned i) >> +{ >> + BEGIN_NV04(push, NV50_3D(RT_ADDRESS_HIGH(i)), 4); >> + PUSH_DATA (push, 0); >> + PUSH_DATA (push, 0); >> + PUSH_DATA (push, NV50_SURFACE_FORMAT_NONE); >> + PUSH_DATA (push, 0); >> + BEGIN_NV04(push, NV50_3D(RT_HORIZ(i)), 2); >> + PUSH_DATA (push, 64); >> + PUSH_DATA (push, 0); >> +} >> >> static void >> nv50_validate_fb(struct nv50_context *nv50) >> @@ -20,9 +33,18 @@ nv50_validate_fb(struct nv50_context *nv50) >> PUSH_DATA (push, fb->height << 16); >> >> for (i = 0; i < fb->nr_cbufs; ++i) { >> - struct nv50_miptree *mt = nv50_miptree(fb->cbufs[i]->texture); >> - struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); >> - struct nouveau_bo *bo = mt->base.bo; >> + struct nv50_miptree *mt; >> + struct nv50_surface *sf; >> + struct nouveau_bo *bo; >> + >> + if (!fb->cbufs[i]) { >> + nv50_fb_set_null_rt(push, i); >> + continue; >> + } >> + >> + mt = nv50_miptree(fb->cbufs[i]->texture); >> + sf = nv50_surface(fb->cbufs[i]); >> + bo = mt->base.bo; >> >> array_size = MIN2(array_size, sf->depth); >> if (mt->layout_3d) >> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c >> index 0ba4bad..dd71c65 100644 >> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c >> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c >> @@ -2,6 +2,7 @@ >> #include "util/u_math.h" >> >> #include "nvc0/nvc0_context.h" >> +#include "nv50/nv50_defs.xml.h" >> >> #if 0 >> static void >> @@ -54,6 +55,18 @@ nvc0_validate_zcull(struct nvc0_context *nvc0) >> } >> #endif >> >> +static INLINE void >> +nvc0_fb_set_null_rt(struct nouveau_pushbuf *push, unsigned i) >> +{ >> + BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 6); >> + PUSH_DATA (push, 0); >> + PUSH_DATA (push, 0); >> + PUSH_DATA (push, 64); >> + PUSH_DATA (push, 0); >> + PUSH_DATA (push, NV50_SURFACE_FORMAT_NONE); >> + PUSH_DATA (push, 0); >> +} >> + >> static void >> nvc0_validate_fb(struct nvc0_context *nvc0) >> { >> @@ -72,9 +85,18 @@ nvc0_validate_fb(struct nvc0_context *nvc0) >> PUSH_DATA (push, fb->height << 16); >> >> for (i = 0; i < fb->nr_cbufs; ++i) { >> - struct nv50_surface *sf = nv50_surface(fb->cbufs[i]); >> - struct nv04_resource *res = nv04_resource(sf->base.texture); >> - struct nouveau_bo *bo = res->bo; >> + struct nv50_surface *sf; >> + struct nv04_resource *res; >> + struct nouveau_bo *bo; >> + >> + if (!fb->cbufs[i]) { >> + nvc0_fb_set_null_rt(push, i); >> + continue; >> + } >> + >> + sf = nv50_surface(fb->cbufs[i]); >> + res = nv04_resource(sf->base.texture); >> + bo = res->bo; >> >> BEGIN_NVC0(push, NVC0_3D(RT_ADDRESS_HIGH(i)), 9); >> PUSH_DATAh(push, res->address + sf->offset); >> > ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <CAKb7UvgB_5omfkrL1mfFUYHL_3Pi8V01NzJJeo2sbKTfuNYOkA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v2] nv50, nvc0: clear out RT on a null cbuf [not found] ` <CAKb7UvgB_5omfkrL1mfFUYHL_3Pi8V01NzJJeo2sbKTfuNYOkA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2014-01-23 20:18 ` Emil Velikov 0 siblings, 0 replies; 10+ messages in thread From: Emil Velikov @ 2014-01-23 20:18 UTC (permalink / raw) To: Ilia Mirkin Cc: mesa-dev-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org On 23/01/14 19:39, Ilia Mirkin wrote: >> Ilia, >> > Do you know why we cannot set the rt height to 64? After all you >> > explicitly set the format to NONE. > Because then the RT would have a size, which we don't want. The real > question is why not set the width to 0. It was that way in Christoph's > code, I assumed he did it that way for a reason. > Err. I meant to say "Why do we set the width to 64", which you've already covered. -Emil ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-01-23 20:33 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-15 7:30 [PATCH] nv50, nvc0: don't crash on a null cbuf Ilia Mirkin
[not found] ` <1389771040-29447-1-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
2014-01-17 2:23 ` [PATCH v2] nv50, nvc0: clear out RT " Ilia Mirkin
2014-01-17 2:23 ` [PATCH] nv50, nvc0: only clear out the buffers that we were asked to clear Ilia Mirkin
[not found] ` <1389925395-22379-2-git-send-email-imirkin-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org>
2014-01-23 20:11 ` [Mesa-dev] " Emil Velikov
[not found] ` <52E17757.2010807-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-23 20:15 ` Ilia Mirkin
2014-01-23 20:31 ` Emil Velikov
[not found] ` <52E17C0C.9050305-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-23 20:33 ` [Mesa-dev] " Ilia Mirkin
2014-01-23 19:40 ` [Nouveau] [PATCH v2] nv50, nvc0: clear out RT on a null cbuf Emil Velikov
[not found] ` <52E1701A.3060203-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-01-23 19:39 ` Ilia Mirkin
[not found] ` <CAKb7UvgB_5omfkrL1mfFUYHL_3Pi8V01NzJJeo2sbKTfuNYOkA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-01-23 20:18 ` Emil Velikov
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.