16173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ 26173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 36173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark/* 46173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org> 56173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * 66173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * Permission is hereby granted, free of charge, to any person obtaining a 76173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * copy of this software and associated documentation files (the "Software"), 86173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * to deal in the Software without restriction, including without limitation 96173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 106173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * and/or sell copies of the Software, and to permit persons to whom the 116173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * Software is furnished to do so, subject to the following conditions: 126173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * 136173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * The above copyright notice and this permission notice (including the next 146173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * paragraph) shall be included in all copies or substantial portions of the 156173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * Software. 166173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * 176173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 186173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 196173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 206173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 216173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 226173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 236173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * SOFTWARE. 246173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * 256173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * Authors: 266173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark * Rob Clark <robclark@freedesktop.org> 276173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark */ 286173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 296173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "pipe/p_state.h" 306173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "util/u_string.h" 316173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "util/u_memory.h" 326173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "util/u_prim.h" 3318c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark#include "util/u_format.h" 346173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 3518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark#include "freedreno_draw.h" 366173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "freedreno_context.h" 376173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "freedreno_state.h" 386173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "freedreno_resource.h" 39b8f78e18907be379415c8c804b634808349fc1d9Rob Clark#include "freedreno_query_hw.h" 406173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark#include "freedreno_util.h" 416173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 42dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkinstatic void 43f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clarkresource_read(struct fd_batch *batch, struct pipe_resource *prsc) 44dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin{ 45dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin if (!prsc) 46dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin return; 479f219c7047b51561f6f69274d445e6a6ec41c5f8Rob Clark fd_batch_resource_used(batch, fd_resource(prsc), false); 485ca032a9a8ece0a8a43151f988215484da3c1811Rob Clark} 495ca032a9a8ece0a8a43151f988215484da3c1811Rob Clark 505ca032a9a8ece0a8a43151f988215484da3c1811Rob Clarkstatic void 51f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clarkresource_written(struct fd_batch *batch, struct pipe_resource *prsc) 525ca032a9a8ece0a8a43151f988215484da3c1811Rob Clark{ 539e4561d3c47c2dabce43ce160915fd9bcea05a81Rob Clark if (!prsc) 549e4561d3c47c2dabce43ce160915fd9bcea05a81Rob Clark return; 559f219c7047b51561f6f69274d445e6a6ec41c5f8Rob Clark fd_batch_resource_used(batch, fd_resource(prsc), true); 56dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin} 576173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 5818c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkstatic void 5918c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkfd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) 6018c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark{ 6118c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark struct fd_context *ctx = fd_context(pctx); 62f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark struct fd_batch *batch = ctx->batch; 63f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark struct pipe_framebuffer_state *pfb = &batch->framebuffer; 64e9edbf0a688c68ef0896e5d4278f411f6b6f8398Rob Clark struct pipe_scissor_state *scissor = fd_context_get_scissor(ctx); 65be8a8ebe578267ab24e343c3c1347936a221468eRob Clark unsigned i, prims, buffers = 0; 6618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark 6718c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark /* if we supported transform feedback, we'd have to disable this: */ 68e9edbf0a688c68ef0896e5d4278f411f6b6f8398Rob Clark if (((scissor->maxx - scissor->minx) * 69e9edbf0a688c68ef0896e5d4278f411f6b6f8398Rob Clark (scissor->maxy - scissor->miny)) == 0) { 7018c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark return; 712bc1fc2fb61897ab188f4a7150233827747827ffRob Clark } 722bc1fc2fb61897ab188f4a7150233827747827ffRob Clark 73d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin /* TODO: push down the region versions into the tiles */ 74d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin if (!fd_render_condition_check(pctx)) 75d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin return; 76d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin 772bc1fc2fb61897ab188f4a7150233827747827ffRob Clark /* emulate unsupported primitives: */ 782bc1fc2fb61897ab188f4a7150233827747827ffRob Clark if (!fd_supported_prim(ctx, info->mode)) { 795ca032a9a8ece0a8a43151f988215484da3c1811Rob Clark if (ctx->streamout.num_targets > 0) 805ca032a9a8ece0a8a43151f988215484da3c1811Rob Clark debug_error("stream-out with emulated prims"); 812bc1fc2fb61897ab188f4a7150233827747827ffRob Clark util_primconvert_save_index_buffer(ctx->primconvert, &ctx->indexbuf); 822bc1fc2fb61897ab188f4a7150233827747827ffRob Clark util_primconvert_save_rasterizer_state(ctx->primconvert, ctx->rasterizer); 832bc1fc2fb61897ab188f4a7150233827747827ffRob Clark util_primconvert_draw_vbo(ctx->primconvert, info); 842bc1fc2fb61897ab188f4a7150233827747827ffRob Clark return; 8518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark } 8618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark 87c44163876a2858aea219a08bd2e048b76953cff9Rob Clark if (ctx->in_blit) { 88c44163876a2858aea219a08bd2e048b76953cff9Rob Clark fd_batch_reset(batch); 89c44163876a2858aea219a08bd2e048b76953cff9Rob Clark ctx->dirty = ~0; 90ba3009688892713b711ca6e9420d813f0bdce43fRob Clark } 91ba3009688892713b711ca6e9420d813f0bdce43fRob Clark 92c44163876a2858aea219a08bd2e048b76953cff9Rob Clark batch->blit = ctx->in_blit; 93c44163876a2858aea219a08bd2e048b76953cff9Rob Clark batch->back_blit = ctx->in_shadow; 94c44163876a2858aea219a08bd2e048b76953cff9Rob Clark 957f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark /* NOTE: needs to be before resource_written(batch->query_buf), otherwise 967f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark * query_buf may not be created yet. 977f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark */ 987f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark fd_hw_query_set_stage(batch, batch->draw, FD_STAGE_DRAW); 99c44163876a2858aea219a08bd2e048b76953cff9Rob Clark 1004af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark /* 1014af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark * Figure out the buffers/features we need: 1024af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark */ 1036173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 104e684c32d2fdda204b79661ecf26881eae133d64aRob Clark pipe_mutex_lock(ctx->screen->lock); 105e684c32d2fdda204b79661ecf26881eae133d64aRob Clark 10618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark if (fd_depth_enabled(ctx)) { 1076173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark buffers |= FD_BUFFER_DEPTH; 108f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_written(batch, pfb->zsbuf->texture); 109f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->gmem_reason |= FD_GMEM_DEPTH_ENABLED; 1106173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark } 1114af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 11218c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark if (fd_stencil_enabled(ctx)) { 1136173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark buffers |= FD_BUFFER_STENCIL; 114f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_written(batch, pfb->zsbuf->texture); 115f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->gmem_reason |= FD_GMEM_STENCIL_ENABLED; 1166173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark } 1176173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 1184af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark if (fd_logicop_enabled(ctx)) 119f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->gmem_reason |= FD_GMEM_LOGICOP_ENABLED; 1204af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 1214af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark for (i = 0; i < pfb->nr_cbufs; i++) { 12289dc2825819c0260511c6596497c8a350d9901a7Rob Clark struct pipe_resource *surf; 12389dc2825819c0260511c6596497c8a350d9901a7Rob Clark 12489dc2825819c0260511c6596497c8a350d9901a7Rob Clark if (!pfb->cbufs[i]) 12589dc2825819c0260511c6596497c8a350d9901a7Rob Clark continue; 12689dc2825819c0260511c6596497c8a350d9901a7Rob Clark 12789dc2825819c0260511c6596497c8a350d9901a7Rob Clark surf = pfb->cbufs[i]->texture; 1284af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 129f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_written(batch, surf); 130602bc6c88dbfa34083aa9d229fb6396b008e23ebIlia Mirkin buffers |= PIPE_CLEAR_COLOR0 << i; 1314af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 1324af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark if (surf->nr_samples > 1) 133f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->gmem_reason |= FD_GMEM_MSAA_ENABLED; 1344af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 1354af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark if (fd_blend_enabled(ctx, i)) 136f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->gmem_reason |= FD_GMEM_BLEND_ENABLED; 1374af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark } 1384af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 1390739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark foreach_bit(i, ctx->constbuf[PIPE_SHADER_VERTEX].enabled_mask) 140f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_read(batch, ctx->constbuf[PIPE_SHADER_VERTEX].cb[i].buffer); 1410739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark foreach_bit(i, ctx->constbuf[PIPE_SHADER_FRAGMENT].enabled_mask) 142f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_read(batch, ctx->constbuf[PIPE_SHADER_FRAGMENT].cb[i].buffer); 143dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin 144dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin /* Mark VBOs as being read */ 1450739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark foreach_bit(i, ctx->vtx.vertexbuf.enabled_mask) { 146dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin assert(!ctx->vtx.vertexbuf.vb[i].user_buffer); 147f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_read(batch, ctx->vtx.vertexbuf.vb[i].buffer); 148dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin } 149dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin 150dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin /* Mark index buffer as being read */ 151f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_read(batch, ctx->indexbuf.buffer); 152dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin 153dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin /* Mark textures as being read */ 1540739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark foreach_bit(i, ctx->verttex.valid_textures) 1550739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark resource_read(batch, ctx->verttex.textures[i]->texture); 1560739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark foreach_bit(i, ctx->fragtex.valid_textures) 1570739bbceecbb66ffbcf14e5b73e6df222794c264Rob Clark resource_read(batch, ctx->fragtex.textures[i]->texture); 158dacf22e0a34d4dc2595f3cb0dbee52318dc9d0d7Ilia Mirkin 1595ca032a9a8ece0a8a43151f988215484da3c1811Rob Clark /* Mark streamout buffers as being written.. */ 160be8a8ebe578267ab24e343c3c1347936a221468eRob Clark for (i = 0; i < ctx->streamout.num_targets; i++) 161be8a8ebe578267ab24e343c3c1347936a221468eRob Clark if (ctx->streamout.targets[i]) 162f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_written(batch, ctx->streamout.targets[i]->buffer); 163be8a8ebe578267ab24e343c3c1347936a221468eRob Clark 1647f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark resource_written(batch, batch->query_buf); 1657f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark 166e684c32d2fdda204b79661ecf26881eae133d64aRob Clark pipe_mutex_unlock(ctx->screen->lock); 167e684c32d2fdda204b79661ecf26881eae133d64aRob Clark 168f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->num_draws++; 1694af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark 170be8a8ebe578267ab24e343c3c1347936a221468eRob Clark prims = u_reduced_prims_for_vertices(info->mode, info->count); 171be8a8ebe578267ab24e343c3c1347936a221468eRob Clark 172646c16af6e23184078995bcd3fc3db00b7c21250Rob Clark ctx->stats.draw_calls++; 1730a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark 1740a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark /* TODO prims_emitted should be clipped when the stream-out buffer is 1750a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark * not large enough. See max_tf_vtx().. probably need to move that 1760a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark * into common code. Although a bit more annoying since a2xx doesn't 1770a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark * use ir3 so no common way to get at the pipe_stream_output_info 1780a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark * which is needed for this calculation. 1790a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark */ 1800a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark if (ctx->streamout.num_targets > 0) 1810a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark ctx->stats.prims_emitted += prims; 1820a4b0fc3154f4e3f926dcd5f2effe199c9fc6754Rob Clark ctx->stats.prims_generated += prims; 183646c16af6e23184078995bcd3fc3db00b7c21250Rob Clark 18401b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark /* any buffers that haven't been cleared yet, we need to restore: */ 185f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->restore |= buffers & (FD_BUFFER_ALL & ~batch->cleared); 1866173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark /* and any buffers used, need to be resolved: */ 187f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->resolve |= buffers; 1886173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 189dcde4cd114e906f5c4372dbb6758026c9222cd2aRob Clark DBG("%p: %x %ux%u num_draws=%u (%s/%s)", batch, buffers, 190dcde4cd114e906f5c4372dbb6758026c9222cd2aRob Clark pfb->width, pfb->height, batch->num_draws, 1914f338c9bbff090d606afdc22373cc7869b0d0c89Rob Clark util_format_short_name(pipe_surface_format(pfb->cbufs[0])), 1924f338c9bbff090d606afdc22373cc7869b0d0c89Rob Clark util_format_short_name(pipe_surface_format(pfb->zsbuf))); 1934f338c9bbff090d606afdc22373cc7869b0d0c89Rob Clark 1942e117a7649c1972cf36ec874d852a3e85d4750faRob Clark if (ctx->draw_vbo(ctx, info)) 195f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->needs_flush = true; 1964f338c9bbff090d606afdc22373cc7869b0d0c89Rob Clark 197be8a8ebe578267ab24e343c3c1347936a221468eRob Clark for (i = 0; i < ctx->streamout.num_targets; i++) 1987e93b26b5d9f926346fb3651c0094fc1caade4d8Rob Clark ctx->streamout.offsets[i] += info->count; 199be8a8ebe578267ab24e343c3c1347936a221468eRob Clark 200ef7a5638290234a9d1f0574585174539e2c126ebRob Clark if (fd_mesa_debug & FD_DBG_DDRAW) 201ef7a5638290234a9d1f0574585174539e2c126ebRob Clark ctx->dirty = 0xffffffff; 202ef7a5638290234a9d1f0574585174539e2c126ebRob Clark 203f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark fd_batch_check_size(batch); 20418c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark} 2056173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 206a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark/* Generic clear implementation (partially) using u_blitter: */ 207a8e6734a83816df2a39e5c4c49721d762caee86bRob Clarkstatic void 208a8e6734a83816df2a39e5c4c49721d762caee86bRob Clarkfd_blitter_clear(struct pipe_context *pctx, unsigned buffers, 209a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark const union pipe_color_union *color, double depth, unsigned stencil) 210a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark{ 211a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct fd_context *ctx = fd_context(pctx); 212a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; 213a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct blitter_context *blitter = ctx->blitter; 214a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 215a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark fd_blitter_pipe_begin(ctx, false, true, FD_STAGE_CLEAR); 216a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 217a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark util_blitter_common_clear_setup(blitter, pfb->width, pfb->height, 218a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark buffers, NULL, NULL); 219a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 220a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct pipe_stencil_ref sr = { 221a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .ref_value = { stencil & 0xff } 222a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark }; 223a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->set_stencil_ref(pctx, &sr); 224a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 225a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct pipe_constant_buffer cb = { 226a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .buffer_size = 16, 227a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .user_buffer = &color->ui, 228a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark }; 229a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->set_constant_buffer(pctx, PIPE_SHADER_FRAGMENT, 0, &cb); 230a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 231a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark if (!ctx->clear_rs_state) { 232a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark const struct pipe_rasterizer_state tmpl = { 233a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .cull_face = PIPE_FACE_NONE, 234a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .half_pixel_center = 1, 235a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .bottom_edge_rule = 1, 236a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .flatshade = 1, 237a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .depth_clip = 1, 238a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark }; 239a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark ctx->clear_rs_state = pctx->create_rasterizer_state(pctx, &tmpl); 240a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark } 241a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->bind_rasterizer_state(pctx, ctx->clear_rs_state); 242a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 243a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct pipe_viewport_state vp = { 244a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .scale = { 0.5f * pfb->width, -0.5f * pfb->height, depth }, 245a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .translate = { 0.5f * pfb->width, 0.5f * pfb->height, 0.0f }, 246a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark }; 247a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->set_viewport_states(pctx, 0, 1, &vp); 248a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 249a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->bind_vertex_elements_state(pctx, ctx->solid_vbuf_state.vtx); 250a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->set_vertex_buffers(pctx, blitter->vb_slot, 1, 251a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark &ctx->solid_vbuf_state.vertexbuf.vb[0]); 252a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->set_stream_output_targets(pctx, 0, NULL, NULL); 253a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->bind_vs_state(pctx, ctx->solid_prog.vp); 254a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark pctx->bind_fs_state(pctx, ctx->solid_prog.fp); 255a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 256a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark struct pipe_draw_info info = { 257a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .mode = PIPE_PRIM_MAX, /* maps to DI_PT_RECTLIST */ 258a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .count = 2, 2595def00875de4f0895e22de94cba29131a26c0430Rob Clark .max_index = 1, 260a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark .instance_count = 1, 261a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark }; 262a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark ctx->draw_vbo(ctx, &info); 263a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 264a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark util_blitter_restore_constant_buffer_state(blitter); 265a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark util_blitter_restore_vertex_states(blitter); 266a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark util_blitter_restore_fragment_states(blitter); 267a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark util_blitter_restore_render_cond(blitter); 268a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark util_blitter_unset_running_flag(blitter); 269a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 270a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark fd_blitter_pipe_end(ctx); 271a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark} 272a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 27318c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark/* TODO figure out how to make better use of existing state mechanism 27418c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark * for clear (and possibly gmem->mem / mem->gmem) so we can (a) keep 27518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark * track of what state really actually changes, and (b) reduce the code 27618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark * in the a2xx/a3xx parts. 27718c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark */ 2786173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 27918c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkstatic void 28018c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkfd_clear(struct pipe_context *pctx, unsigned buffers, 28118c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark const union pipe_color_union *color, double depth, unsigned stencil) 28218c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark{ 28318c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark struct fd_context *ctx = fd_context(pctx); 284f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark struct fd_batch *batch = ctx->batch; 285f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark struct pipe_framebuffer_state *pfb = &batch->framebuffer; 28601b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark struct pipe_scissor_state *scissor = fd_context_get_scissor(ctx); 28701b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark unsigned cleared_buffers; 288602bc6c88dbfa34083aa9d229fb6396b008e23ebIlia Mirkin int i; 28901b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark 290d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin /* TODO: push down the region versions into the tiles */ 291d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin if (!fd_render_condition_check(pctx)) 292d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin return; 293d69e557f2a2c39888d83c7b52244412ee2a5594eIlia Mirkin 294c44163876a2858aea219a08bd2e048b76953cff9Rob Clark if (ctx->in_blit) { 295c44163876a2858aea219a08bd2e048b76953cff9Rob Clark fd_batch_reset(batch); 296c44163876a2858aea219a08bd2e048b76953cff9Rob Clark ctx->dirty = ~0; 297ba3009688892713b711ca6e9420d813f0bdce43fRob Clark } 298ba3009688892713b711ca6e9420d813f0bdce43fRob Clark 29901b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark /* for bookkeeping about which buffers have been cleared (and thus 30001b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark * can fully or partially skip mem2gmem) we need to ignore buffers 30101b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark * that have already had a draw, in case apps do silly things like 30201b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark * clear after draw (ie. if you only clear the color buffer, but 30301b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark * something like alpha-test causes side effects from the draw in 30401b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark * the depth buffer, etc) 30501b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark */ 306f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark cleared_buffers = buffers & (FD_BUFFER_ALL & ~batch->restore); 30701b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark 30801b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark /* do we have full-screen scissor? */ 30901b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark if (!memcmp(scissor, &ctx->disabled_scissor, sizeof(*scissor))) { 310f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->cleared |= cleared_buffers; 31101b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark } else { 312f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->partial_cleared |= cleared_buffers; 31301b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark if (cleared_buffers & PIPE_CLEAR_COLOR) 314f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->cleared_scissor.color = *scissor; 31501b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark if (cleared_buffers & PIPE_CLEAR_DEPTH) 316f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->cleared_scissor.depth = *scissor; 31701b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark if (cleared_buffers & PIPE_CLEAR_STENCIL) 318f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->cleared_scissor.stencil = *scissor; 31901b757e2b0fb97a146b0ef278b449cecab0d15e8Rob Clark } 320f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->resolve |= buffers; 321f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->needs_flush = true; 3226173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 323e684c32d2fdda204b79661ecf26881eae133d64aRob Clark pipe_mutex_lock(ctx->screen->lock); 324e684c32d2fdda204b79661ecf26881eae133d64aRob Clark 32518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark if (buffers & PIPE_CLEAR_COLOR) 326602bc6c88dbfa34083aa9d229fb6396b008e23ebIlia Mirkin for (i = 0; i < pfb->nr_cbufs; i++) 327602bc6c88dbfa34083aa9d229fb6396b008e23ebIlia Mirkin if (buffers & (PIPE_CLEAR_COLOR0 << i)) 328f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_written(batch, pfb->cbufs[i]->texture); 3296173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 3304af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark if (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) { 331f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark resource_written(batch, pfb->zsbuf->texture); 332f02a64dbdd2ec147167ad60357bd46d8d964290aRob Clark batch->gmem_reason |= FD_GMEM_CLEARS_DEPTH_STENCIL; 3334af1dcbb7d5431ae75cc39568c99d7a20231f081Rob Clark } 3346173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 3357f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark resource_written(batch, batch->query_buf); 3367f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark 337e684c32d2fdda204b79661ecf26881eae133d64aRob Clark pipe_mutex_unlock(ctx->screen->lock); 338e684c32d2fdda204b79661ecf26881eae133d64aRob Clark 339dcde4cd114e906f5c4372dbb6758026c9222cd2aRob Clark DBG("%p: %x %ux%u depth=%f, stencil=%u (%s/%s)", batch, buffers, 340dcde4cd114e906f5c4372dbb6758026c9222cd2aRob Clark pfb->width, pfb->height, depth, stencil, 3414c91930a257ac500029f56514c5504ad66b7cf8fRob Clark util_format_short_name(pipe_surface_format(pfb->cbufs[0])), 3424c91930a257ac500029f56514c5504ad66b7cf8fRob Clark util_format_short_name(pipe_surface_format(pfb->zsbuf))); 34318c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark 344a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark /* if per-gen backend doesn't implement ctx->clear() generic 345a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark * blitter clear: 346a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark */ 347a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark if (!ctx->clear) { 348a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark fd_blitter_clear(pctx, buffers, color, depth, stencil); 349a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark return; 350a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark } 351a8e6734a83816df2a39e5c4c49721d762caee86bRob Clark 3527f8fd02dc7cad1ddcfb610db10ffbb41e3e34e7dRob Clark fd_hw_query_set_stage(batch, batch->draw, FD_STAGE_CLEAR); 353b8f78e18907be379415c8c804b634808349fc1d9Rob Clark 35418c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark ctx->clear(ctx, buffers, color, depth, stencil); 3556173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 35618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark ctx->dirty |= FD_DIRTY_ZSA | 357c0766528baaef48902c87bbdaa4f5926c472269bRob Clark FD_DIRTY_VIEWPORT | 35818c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark FD_DIRTY_RASTERIZER | 35918c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark FD_DIRTY_SAMPLE_MASK | 36018c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark FD_DIRTY_PROG | 36118c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark FD_DIRTY_CONSTBUF | 362054526e49abb5e7fd49fed6f589cff6f1ab4c9f6Rob Clark FD_DIRTY_BLEND | 363054526e49abb5e7fd49fed6f589cff6f1ab4c9f6Rob Clark FD_DIRTY_FRAMEBUFFER; 3646173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 36518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark if (fd_mesa_debug & FD_DBG_DCLEAR) 36618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark ctx->dirty = 0xffffffff; 36718c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark} 36818c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark 36918c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkstatic void 37018c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkfd_clear_render_target(struct pipe_context *pctx, struct pipe_surface *ps, 37118c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark const union pipe_color_union *color, 372a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák unsigned x, unsigned y, unsigned w, unsigned h, 373a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák bool render_condition_enabled) 37418c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark{ 37518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark DBG("TODO: x=%u, y=%u, w=%u, h=%u", x, y, w, h); 37618c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark} 37718c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark 37818c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkstatic void 37918c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkfd_clear_depth_stencil(struct pipe_context *pctx, struct pipe_surface *ps, 38018c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark unsigned buffers, double depth, unsigned stencil, 381a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák unsigned x, unsigned y, unsigned w, unsigned h, 382a909210131494a6a131855d7d344b61b81fbf40eMarek Olšák bool render_condition_enabled) 38318c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark{ 38418c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark DBG("TODO: buffers=%u, depth=%f, stencil=%u, x=%u, y=%u, w=%u, h=%u", 38518c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark buffers, depth, stencil, x, y, w, h); 3866173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark} 3876173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark 3886173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clarkvoid 38918c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clarkfd_draw_init(struct pipe_context *pctx) 3906173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark{ 3916173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark pctx->draw_vbo = fd_draw_vbo; 39218c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark pctx->clear = fd_clear; 39318c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark pctx->clear_render_target = fd_clear_render_target; 39418c317b21ddc2ec4538544f9dd69dc568dcf821fRob Clark pctx->clear_depth_stencil = fd_clear_depth_stencil; 3956173cc19c45d92ef0b7bc6aa008aa89bb29abbdaRob Clark} 396