[Mesa-dev] [RFC PATCH] mesa/st/cb_clear: in st_Clear also validate the render state (needed by virgl)
Gert Wollny
gert.wollny at collabora.com
Fri May 4 21:30:56 UTC 2018
Am Freitag, den 04.05.2018, 16:11 -0400 schrieb Ilia Mirkin:
> On Fri, May 4, 2018 at 2:50 PM, Gert Wollny <gert.wollny at collabora.co
> m> wrote:
> > For that reason I think that a render state validation within
> > st_Clear makes sense, because it makes sure that the states
> > like SCISSOR_TEST or DISCARD_RASTERIZER are properly send to the
> > driver, before clear() is executed that makes use of these states.
> > And while the workaround for DISCARD_RASTERIZER is possible because
> > if it is set then the host should actually never see the clear
> > command, SCISSOR_TEST is different, its state can not be guessed on
> > the host.
> >
> > Anyway, I happily take every hint on how this can be fixed directly
> > in virgl_clear or virgl in general, and thank you for taking the
> > time to answer me,
>
> I thought someone else took care of the scissor thing for clears. At
> least they were asking about it.
When I implemented the "disable rasterizer_discard" before clear in
virglrenderer I had tests failing that include scissors, so that's why
I assumed that it migt be a problem, but with your list below, I don't
think that it is really that important which state gets not updated
properly, because they all should be send to virglrenderer.
>
> I have to assume that virglrenderer keeps track of the last-set
> rasterizer state. Based on that, you have to turn off scissors,
> rasterizer discard, window rectangles, stencil tests, sample
> masks(?), and anything else which affects clears (have a look at
> st_Clear -- anything that causes it to hit the fallback path which
> draws should be something you turn off because calling glClear() in
> virglrenderer).
As far as I can seen the rasterizer state is updated with the last draw
command, but, to take scissors as an example, when I set and enable
scissors before a clear, then this is not transmitted, and the clear on
the host doesn't take a possible active scissore state into a account.
How does turning off scissors in virglrenderer help me with that? (same
for the other states).
> If you don't keep track of the last-set rasterizer state, then now
> may be a good time to start :)
When you refer to the states that are set after the last draw command
but before a clear, then no, they are not updated in virglrenderer
because there is no code path that exposed them to the driver, and this
is where I'm stuck.
Now reading a bit more in the code I find it strange that in
st_validate_state with (pipeline = ST_PIPELINE_CLEAR) not all states
that actually have an influenze on the clear command are updated (i.e.
the render states). I find this surprising ...
Best,
Gert
More information about the mesa-dev
mailing list