13192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz/********************************************************** 23192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Copyright 2008-2009 VMware, Inc. All rights reserved. 33192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 43192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * Permission is hereby granted, free of charge, to any person 53192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * obtaining a copy of this software and associated documentation 63192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * files (the "Software"), to deal in the Software without 73192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * restriction, including without limitation the rights to use, copy, 83192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * modify, merge, publish, distribute, sublicense, and/or sell copies 93192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * of the Software, and to permit persons to whom the Software is 103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * furnished to do so, subject to the following conditions: 113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * The above copyright notice and this permission notice shall be 133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * included in all copies or substantial portions of the Software. 143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * SOFTWARE. 233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * 243192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz **********************************************************/ 253192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 263192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_cmd.h" 273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_defines.h" 2928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 303192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "pipe/p_screen.h" 313192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_memory.h" 32cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca#include "util/u_bitmask.h" 333192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "util/u_upload_mgr.h" 343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 353192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_context.h" 363192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_screen.h" 370ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca#include "svga_surface.h" 38287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_texture.h" 39287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource_buffer.h" 40287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "svga_resource.h" 413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_winsys.h" 423192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_swtnl.h" 433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_draw.h" 443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_debug.h" 453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz#include "svga_state.h" 463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 47daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(no_swtnl, "SVGA_NO_SWTNL", FALSE) 48daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(force_swtnl, "SVGA_FORCE_SWTNL", FALSE); 49daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(use_min_mipmap, "SVGA_USE_MIN_MIPMAP", FALSE); 50daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob BornecrantzDEBUG_GET_ONCE_NUM_OPTION(disable_shader, "SVGA_DISABLE_SHADER", ~0); 51c523f31f4a35f8396ab35859c70fb041c210cedbJakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(no_line_width, "SVGA_NO_LINE_WIDTH", FALSE); 52c523f31f4a35f8396ab35859c70fb041c210cedbJakob BornecrantzDEBUG_GET_ONCE_BOOL_OPTION(force_hw_line_stipple, "SVGA_FORCE_HW_LINE_STIPPLE", FALSE); 533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzstatic void svga_destroy( struct pipe_context *pipe ) 553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = svga_context( pipe ); 573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz unsigned shader; 583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_cleanup_framebuffer( svga ); 603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_cleanup_tss_binding( svga ); 613192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 623192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_destroy( svga->hwtnl ); 633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_cleanup_vertex_state(svga); 653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc->destroy(svga->swc); 673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_destroy_swtnl( svga ); 693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_vb ); 713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_ib ); 723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 73cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->vs_bm ); 74cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->fs_bm ); 75cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz for(shader = 0; shader < PIPE_SHADER_TYPES; ++shader) 77287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference( &svga->curr.cb[shader], NULL ); 783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE( svga ); 803192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 813192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 823192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 847f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwellstruct pipe_context *svga_context_create( struct pipe_screen *screen, 857f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell void *priv ) 863192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(screen); 883192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_context *svga = NULL; 893192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret; 903192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 913192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga = CALLOC_STRUCT(svga_context); 923192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga == NULL) 93da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_svga; 943192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.screen = screen; 967f41f5447c8f9113c8956901e1c5fff6081ecd94Keith Whitwell svga->pipe.priv = priv; 973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.destroy = svga_destroy; 983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->pipe.clear = svga_clear; 993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc = svgascreen->sws->context_create(svgascreen->sws); 1013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if(!svga->swc) 102da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_swc; 1033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell svga_init_resource_functions(svga); 1053192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_blend_functions(svga); 1063192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_blit_functions(svga); 1073192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_depth_stencil_functions(svga); 1083192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_draw_functions(svga); 1093192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_flush_functions(svga); 1103192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_misc_functions(svga); 1113192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_rasterizer_functions(svga); 1123192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_sampler_functions(svga); 1133192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_fs_functions(svga); 1143192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_vs_functions(svga); 1153192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_vertex_functions(svga); 1163192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_constbuffer_functions(svga); 1173192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_init_query_functions(svga); 1184c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger svga_init_surface_functions(svga); 1193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 12013a13fcb8054ed2d1138f6754fc67b014cc5cd5dMichel Dänzer 1213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* debug */ 122daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.no_swtnl = debug_get_option_no_swtnl(); 123daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.force_swtnl = debug_get_option_force_swtnl(); 124daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.use_min_mipmap = debug_get_option_use_min_mipmap(); 125daaf542220e5008b54648c6ed853f3f4f87fc7b5Jakob Bornecrantz svga->debug.disable_shader = debug_get_option_disable_shader(); 126c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz svga->debug.no_line_width = debug_get_option_no_line_width(); 127c523f31f4a35f8396ab35859c70fb041c210cedbJakob Bornecrantz svga->debug.force_hw_line_stipple = debug_get_option_force_hw_line_stipple(); 1283192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 129cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->fs_bm = util_bitmask_create(); 130cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (svga->fs_bm == NULL) 131cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto no_fs_bm; 132cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 133cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca svga->vs_bm = util_bitmask_create(); 134cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca if (svga->vs_bm == NULL) 135cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca goto no_vs_bm; 136cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca 137287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell svga->upload_ib = u_upload_create( &svga->pipe, 1383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 32 * 1024, 1393192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 16, 140287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_INDEX_BUFFER ); 1413192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->upload_ib == NULL) 142da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_upload_ib; 1433192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 144287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell svga->upload_vb = u_upload_create( &svga->pipe, 1453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 128 * 1024, 1463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 16, 147287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_BIND_VERTEX_BUFFER ); 1483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->upload_vb == NULL) 149da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_upload_vb; 1503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->hwtnl = svga_hwtnl_create( svga, 1523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->upload_ib, 1533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc ); 1543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (svga->hwtnl == NULL) 155da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_hwtnl; 1563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1570cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonseca if (!svga_init_swtnl(svga)) 1580cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonseca goto no_swtnl; 1593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1603192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_emit_initial_state( svga ); 1615f053bf4ae092df9e5ff6ab38caf9867e6fe46bfBrian Paul if (ret != PIPE_OK) 162da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonseca goto no_state; 1633192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1643192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Avoid shortcircuiting state with initial value of zero. 1653192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 1663192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_clear, 0xcd, sizeof(svga->state.hw_clear)); 1673192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_clear.framebuffer, 0x0, 1683192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz sizeof(svga->state.hw_clear.framebuffer)); 1693192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1703192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_draw, 0xcd, sizeof(svga->state.hw_draw)); 1713192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz memset(&svga->state.hw_draw.views, 0x0, sizeof(svga->state.hw_draw.views)); 1723192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->state.hw_draw.num_views = 0; 1733192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1743192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->dirty = ~0; 1753192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1763192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz LIST_INITHEAD(&svga->dirty_buffers); 1773192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 1783192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return &svga->pipe; 1793192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 180da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_state: 1810cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonseca svga_destroy_swtnl(svga); 1820cb6329e8941dc7937c8aeea4b2e83c77881bd3aJosé Fonsecano_swtnl: 1833192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_hwtnl_destroy( svga->hwtnl ); 184da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_hwtnl: 1853192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_vb ); 186da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_upload_vb: 1873192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz u_upload_destroy( svga->upload_ib ); 188da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_upload_ib: 189cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->vs_bm ); 190cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonsecano_vs_bm: 191cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonseca util_bitmask_destroy( svga->fs_bm ); 192cdb445f3a9285e2d8f042a07021ade78b94e0156José Fonsecano_fs_bm: 1933192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga->swc->destroy(svga->swc); 194da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_swc: 1953192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz FREE(svga); 196da6a80301b2cfdc6902198e3fef5ec78e86e39cfJosé Fonsecano_svga: 1973192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz return NULL; 1983192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 1993192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2003192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2013192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_context_flush( struct svga_context *svga, 2023192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct pipe_fence_handle **pfence ) 2033192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2043192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz struct svga_screen *svgascreen = svga_screen(svga->pipe.screen); 205b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca struct pipe_fence_handle *fence = NULL; 206b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell 207b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell svga->curr.nr_fbs = 0; 208b84b7f19dfdc0ac02175847065b39110db7ad98fKeith Whitwell 2090277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom /* Flush the upload managers to ensure recycling of upload buffers 2100277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom * without throttling. This should really be conditioned on 2110277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom * pipe_buffer_map_range not supporting PIPE_TRANSFER_UNSYNCHRONIZED. 2120277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom */ 2130277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom 2140277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom u_upload_flush(svga->upload_vb); 2150277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom u_upload_flush(svga->upload_ib); 2160277df86dfdf1738396bc7885bec3054c86c834fThomas Hellstrom 217b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca /* Ensure that texture dma uploads are processed 2183192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz * before submitting commands. 2193192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 2203192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush_buffers(svga); 2213192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2223192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz /* Flush pending commands to hardware: 2233192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz */ 224b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca svga->swc->flush(svga->swc, &fence); 225b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca 226b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca svga_screen_cache_flush(svgascreen, fence); 2273192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2286b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca /* To force the re-emission of rendertargets and texture sampler bindings on 2296b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca * the next command buffer. 230369ece170257ef687ca609cacd1d66d186274eb3José Fonseca */ 2316b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca svga->rebind.rendertargets = TRUE; 2326b95cfb0de1bcd680679a20d6ecc32b42e5d1546José Fonseca svga->rebind.texture_samplers = TRUE; 233369ece170257ef687ca609cacd1d66d186274eb3José Fonseca 2343192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (SVGA_DEBUG & DEBUG_SYNC) { 235b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca if (fence) 236bfe88e69988b3d3bdff0b9f6051d0428e1315653Marek Olšák svga->pipe.screen->fence_finish( svga->pipe.screen, fence, 237b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák PIPE_TIMEOUT_INFINITE); 2383192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 239b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca 240b84590994c4261d85485357263146d5e3d8827ebJosé Fonseca if(pfence) 2416235846cb779bce470bc903f8cfc701bc0343d73Thomas Hellstrom svgascreen->sws->fence_reference(svgascreen->sws, pfence, fence); 2426235846cb779bce470bc903f8cfc701bc0343d73Thomas Hellstrom 2436235846cb779bce470bc903f8cfc701bc0343d73Thomas Hellstrom svgascreen->sws->fence_reference(svgascreen->sws, &fence, NULL); 2443192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2453192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2463192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2473192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantzvoid svga_hwtnl_flush_retry( struct svga_context *svga ) 2483192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz{ 2493192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz enum pipe_error ret = PIPE_OK; 2503192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2513192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_hwtnl_flush( svga->hwtnl ); 2523192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz if (ret == PIPE_ERROR_OUT_OF_MEMORY) { 2533192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz svga_context_flush( svga, NULL ); 2543192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz ret = svga_hwtnl_flush( svga->hwtnl ); 2553192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz } 2563192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2573192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz assert(ret == 0); 2583192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz} 2593192633d4abe262d413e41feb871fe8deed409d8Jakob Bornecrantz 2600ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2611e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca/** 2621e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca * Flush the primitive queue if this buffer is referred. 2631e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca * 2641e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca * Otherwise DMA commands on the referred buffer will be emitted too late. 2651e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca */ 2661e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonsecavoid svga_hwtnl_flush_buffer( struct svga_context *svga, 2671e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca struct pipe_resource *buffer ) 2681e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca{ 2691e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca if (svga_hwtnl_is_buffer_referred(svga->hwtnl, buffer)) { 2701e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca svga_hwtnl_flush_retry(svga); 2711e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca } 2721e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca} 2731e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca 2741e9d8934a1a56e888f07a3571038a3f9205a72aeJosé Fonseca 2750ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca/* Emit all operations pending on host surfaces. 2760ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca */ 2770ced789a0b56256891a2a26342befe645f4fa46dJosé Fonsecavoid svga_surfaces_flush(struct svga_context *svga) 2780ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca{ 2790ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca unsigned i; 2800ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2810ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca /* Emit buffered drawing commands. 2820ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca */ 2830ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca svga_hwtnl_flush_retry( svga ); 2840ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2850ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca /* Emit back-copy from render target view to texture. 2860ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca */ 2870ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 2880ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca if (svga->curr.framebuffer.cbufs[i]) 2890ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca svga_propagate_surface(svga, svga->curr.framebuffer.cbufs[i]); 2900ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca } 2910ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2920ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca if (svga->curr.framebuffer.zsbuf) 2930ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca svga_propagate_surface(svga, svga->curr.framebuffer.zsbuf); 2940ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2950ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca} 2960ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 2970ced789a0b56256891a2a26342befe645f4fa46dJosé Fonseca 298cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstromstruct svga_winsys_context * 299cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstromsvga_winsys_context( struct pipe_context *pipe ) 300cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstrom{ 301cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstrom return svga_context( pipe )->swc; 302cd151effe654c460c46ba55780eb89b3072077c0Thomas Hellstrom} 303