etnaviv: flush color cache and depth cache together before resolves
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 9 May 2017 16:26:57 +0000 (18:26 +0200)
committerLucas Stach <l.stach@pengutronix.de>
Fri, 14 Jul 2017 15:12:36 +0000 (17:12 +0200)
commite9b3381715f55f4c6b0bc6bec3290fb1be338bb8
treee2f0714bd93fc89262666dee9525ebac806eae7b
parenta98c1fbd9bd8601ef4aecb5edbb8af74a32067c2
etnaviv: flush color cache and depth cache together before resolves

Before resolving a rendertarget or a depth/stencil resource into a
texture, flush both the color cache and the depth cache together.

It is unclear whether this is necessary for the following stall to
work properly, or whether the depth flush just adds enough time
for the color cache flush to finish before the resolver is started,
but this change removes artifacts that otherwise appear if a texture
is sampled directly after rendering into it.

The test case is a simple QML scene graph with a QtWebEngine based
WebView rendered on top of a blue background:

import QtQuick 2.0
import QtQuick.Window 2.2
import QtWebView 1.1

Window {
Rectangle {
id: background
anchors.fill: parent
color: "blue"
}

WebView {
id: webView
anchors.fill: parent
}

Component.onCompleted: {
webView.url = "<some animated website>"
}
}

If the website is animated, the WebView renders the site contents into
texture tiles and immediately afterwards samples from them to draw the
tiles into the Qt renderbuffer. Without this patch, a small irregular
triangle in the lower right of each browser tile appears solid blue, as
if the texture sampler samples zeroes instead of the website contents,
and the previously rendered blue Rectangle shows through.

Other attempts such as adding a pipeline stall before the color flush or
a TS cache flush afterwards or flushing multiple times, with stalls
before and after each flush, have shown no effect.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
src/gallium/drivers/etnaviv/etnaviv_clear_blit.c