1f540c54701e3eeb34cb619a3a4eb18f1ac70ef2dJordan Rose/************************************************************************** 2740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * 3740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * All Rights Reserved. 5740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * 6740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Permission is hereby granted, free of charge, to any person obtaining a 7740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * copy of this software and associated documentation files (the 8740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * "Software"), to deal in the Software without restriction, including 9740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * without limitation the rights to use, copy, modify, merge, publish, 10740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * distribute, sub license, and/or sell copies of the Software, and to 11740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * permit persons to whom the Software is furnished to do so, subject to 12740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * the following conditions: 13740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * 14740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * The above copyright notice and this permission notice (including the 15740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * next paragraph) shall be included in all copies or substantial portions 16740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * of the Software. 17740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * 18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * 26b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose **************************************************************************/ 27740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 28740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/** 2928038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose * @file 3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose * Copy/blit pixel rect between surfaces 3128038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose * 32740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * @author Brian Paul 33740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 34740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 35740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 36740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "pipe/p_context.h" 37740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "util/u_debug.h" 38740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "pipe/p_defines.h" 39645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose#include "util/u_inlines.h" 40645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose#include "pipe/p_shader_tokens.h" 418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose#include "pipe/p_state.h" 42645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 43645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose#include "util/u_blit.h" 44645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose#include "util/u_draw_quad.h" 4570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose#include "util/u_format.h" 46740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "util/u_math.h" 4770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose#include "util/u_memory.h" 488919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose#include "util/u_sampler.h" 49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "util/u_simple_shaders.h" 50740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 51972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose#include "cso_cache/cso_context.h" 52d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 53972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 54d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosestruct blit_state 55d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose{ 56d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_context *pipe; 57d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct cso_context *cso; 58d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 59d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_blend_state blend_write_color, blend_keep_color; 60d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_depth_stencil_alpha_state dsa_keep_depthstencil; 61d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_depth_stencil_alpha_state dsa_write_depthstencil; 62d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_depth_stencil_alpha_state dsa_write_depth; 6357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose struct pipe_depth_stencil_alpha_state dsa_write_stencil; 6457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose struct pipe_rasterizer_state rasterizer; 6557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose struct pipe_sampler_state sampler; 6657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose struct pipe_viewport_state viewport; 6757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose struct pipe_vertex_element velem[2]; 6857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose enum pipe_texture_target internal_target; 6957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 70d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose void *vs; 71b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose void *fs[PIPE_MAX_TEXTURE_TYPES][TGSI_WRITEMASK_XYZW + 1]; 721becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks void *fs_depthstencil[PIPE_MAX_TEXTURE_TYPES]; 735960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks void *fs_depth[PIPE_MAX_TEXTURE_TYPES]; 741becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks void *fs_stencil[PIPE_MAX_TEXTURE_TYPES]; 751becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 761becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks struct pipe_resource *vbuf; /**< quad vertices */ 771becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks unsigned vbuf_slot; 781becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 79fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks float vertices[4][2][4]; /**< vertex/texcoords for quad */ 801becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 811becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks boolean has_stencil_export; 82fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks}; 835960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks 845960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks 855960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks/** 861becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks * Create state object for blit. 871becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks * Intended to be created once and re-used for many blit() calls. 88fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks */ 895960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaksstruct blit_state * 90fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaksutil_create_blit(struct pipe_context *pipe, struct cso_context *cso) 91fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks{ 92fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks struct blit_state *ctx; 93fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks uint i; 945960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks 951becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks ctx = CALLOC_STRUCT(blit_state); 961becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks if (!ctx) 971becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks return NULL; 981becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 995960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks ctx->pipe = pipe; 1001becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks ctx->cso = cso; 1011becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks 1021becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks /* disabled blending/masking */ 1031becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks ctx->blend_write_color.rt[0].colormask = PIPE_MASK_RGBA; 104e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks 105e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks /* depth stencil states */ 106740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->dsa_write_depth.depth.enabled = 1; 107740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->dsa_write_depth.depth.writemask = 1; 108972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_depth.depth.func = PIPE_FUNC_ALWAYS; 109972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_stencil.stencil[0].enabled = 1; 110972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_stencil.stencil[0].func = PIPE_FUNC_ALWAYS; 111972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 112972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_stencil.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 113972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_stencil.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 114972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->dsa_write_stencil.stencil[0].valuemask = 0xff; 115740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->dsa_write_stencil.stencil[0].writemask = 0xff; 116740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->dsa_write_depthstencil.depth = ctx->dsa_write_depth.depth; 117740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->dsa_write_depthstencil.stencil[0] = ctx->dsa_write_stencil.stencil[0]; 118740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 119b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /* rasterizer */ 1207c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->rasterizer.cull_face = PIPE_FACE_NONE; 1217c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->rasterizer.gl_rasterization_rules = 1; 122b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->rasterizer.depth_clip = 1; 123b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 124f56faa01936b9cf909623d7f06e3c2569ca4a78eDmitri Gribenko /* samplers */ 1257c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 126740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 127b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; 128b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; 129972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->sampler.min_img_filter = 0; /* set later */ 130972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->sampler.mag_img_filter = 0; /* set later */ 131972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 132972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /* vertex elements state */ 133b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose for (i = 0; i < 2; i++) { 134b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->velem[i].src_offset = i * 4 * sizeof(float); 135972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->velem[i].instance_divisor = 0; 136972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->velem[i].vertex_buffer_index = 0; 137972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 138972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose } 139972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 140972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->vbuf = NULL; 141972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 142972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /* init vertex data that doesn't change */ 143d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose for (i = 0; i < 4; i++) { 144d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->vertices[i][0][3] = 1.0f; /* w */ 1457c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->vertices[i][1][2] = 0.0f; /* r */ 146972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->vertices[i][1][3] = 1.0f; /* q */ 147b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 1487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 149972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose if(pipe->screen->get_param(pipe->screen, PIPE_CAP_NPOT_TEXTURES)) 150972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->internal_target = PIPE_TEXTURE_2D; 151972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose else 152972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->internal_target = PIPE_TEXTURE_RECT; 153972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 154972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->has_stencil_export = 155b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose pipe->screen->get_param(pipe->screen, PIPE_CAP_SHADER_STENCIL_EXPORT); 156972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 157972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose return ctx; 158972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose} 159740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 160740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 161b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose/** 162740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Destroy a blit context 163740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 164972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosevoid 165740d490593e0de8732a697c9f77b90ddd463863bJordan Roseutil_destroy_blit(struct blit_state *ctx) 166740d490593e0de8732a697c9f77b90ddd463863bJordan Rose{ 167740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_context *pipe = ctx->pipe; 168740d490593e0de8732a697c9f77b90ddd463863bJordan Rose unsigned i, j; 1697c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 170740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (ctx->vs) 171740d490593e0de8732a697c9f77b90ddd463863bJordan Rose pipe->delete_vs_state(pipe, ctx->vs); 1727c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 1737c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose for (i = 0; i < Elements(ctx->fs); i++) { 174b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose for (j = 0; j < Elements(ctx->fs[i]); j++) { 1757c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose if (ctx->fs[i][j]) 176b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose pipe->delete_fs_state(pipe, ctx->fs[i][j]); 177740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 178740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 1797c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 1807c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { 1817c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose if (ctx->fs_depthstencil[i]) { 182740d490593e0de8732a697c9f77b90ddd463863bJordan Rose pipe->delete_fs_state(pipe, ctx->fs_depthstencil[i]); 1835a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks } 1845a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks if (ctx->fs_depth[i]) { 1855a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks pipe->delete_fs_state(pipe, ctx->fs_depth[i]); 1865a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks } 1875a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks if (ctx->fs_stencil[i]) { 1885a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks pipe->delete_fs_state(pipe, ctx->fs_stencil[i]); 1895a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks } 1905a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks } 1915a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks 1925a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks pipe_resource_reference(&ctx->vbuf, NULL); 193ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 1945960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks FREE(ctx); 195ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek} 196ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 197740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 198740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/** 199b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose * Helper function to set the fragment shaders. 200b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose */ 201b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rosestatic INLINE void 202740d490593e0de8732a697c9f77b90ddd463863bJordan Roseset_fragment_shader(struct blit_state *ctx, uint writemask, 203740d490593e0de8732a697c9f77b90ddd463863bJordan Rose enum pipe_texture_target pipe_tex) 204740d490593e0de8732a697c9f77b90ddd463863bJordan Rose{ 205740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (!ctx->fs[pipe_tex][writemask]) { 206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(pipe_tex, 0); 207740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2087c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->fs[pipe_tex][writemask] = 209740d490593e0de8732a697c9f77b90ddd463863bJordan Rose util_make_fragment_tex_shader_writemask(ctx->pipe, tgsi_tex, 210740d490593e0de8732a697c9f77b90ddd463863bJordan Rose TGSI_INTERPOLATE_LINEAR, 211740d490593e0de8732a697c9f77b90ddd463863bJordan Rose writemask); 212740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 213740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 214740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_set_fragment_shader_handle(ctx->cso, ctx->fs[pipe_tex][writemask]); 215740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} 216740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 217740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 218740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/** 219b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose * Helper function to set the shader which writes depth and stencil. 220740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 221740d490593e0de8732a697c9f77b90ddd463863bJordan Rosestatic INLINE void 222740d490593e0de8732a697c9f77b90ddd463863bJordan Roseset_depthstencil_fragment_shader(struct blit_state *ctx, 223740d490593e0de8732a697c9f77b90ddd463863bJordan Rose enum pipe_texture_target pipe_tex) 224740d490593e0de8732a697c9f77b90ddd463863bJordan Rose{ 225740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (!ctx->fs_depthstencil[pipe_tex]) { 226740d490593e0de8732a697c9f77b90ddd463863bJordan Rose unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(pipe_tex, 0); 227740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 228740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->fs_depthstencil[pipe_tex] = 229740d490593e0de8732a697c9f77b90ddd463863bJordan Rose util_make_fragment_tex_shader_writedepthstencil(ctx->pipe, tgsi_tex, 230740d490593e0de8732a697c9f77b90ddd463863bJordan Rose TGSI_INTERPOLATE_LINEAR); 231de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose } 232de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose 2337c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_set_fragment_shader_handle(ctx->cso, ctx->fs_depthstencil[pipe_tex]); 2347c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose} 2357c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 236de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose 237740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/** 2387c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose * Helper function to set the shader which writes depth. 239740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 240740d490593e0de8732a697c9f77b90ddd463863bJordan Rosestatic INLINE void 241740d490593e0de8732a697c9f77b90ddd463863bJordan Roseset_depth_fragment_shader(struct blit_state *ctx, 2427c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose enum pipe_texture_target pipe_tex) 243740d490593e0de8732a697c9f77b90ddd463863bJordan Rose{ 244740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (!ctx->fs_depth[pipe_tex]) { 2457c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(pipe_tex, 0); 246740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 2477c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->fs_depth[pipe_tex] = 248740d490593e0de8732a697c9f77b90ddd463863bJordan Rose util_make_fragment_tex_shader_writedepth(ctx->pipe, tgsi_tex, 249740d490593e0de8732a697c9f77b90ddd463863bJordan Rose TGSI_INTERPOLATE_LINEAR); 250740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 251740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 252740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_set_fragment_shader_handle(ctx->cso, ctx->fs_depth[pipe_tex]); 253740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} 254740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 25585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 25685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose/** 25785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose * Helper function to set the shader which writes stencil. 25885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose */ 25985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rosestatic INLINE void 2607c99aa385178c630e29f671299cdd9c104f1c885Jordan Roseset_stencil_fragment_shader(struct blit_state *ctx, 2617c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose enum pipe_texture_target pipe_tex) 2627c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose{ 26385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose if (!ctx->fs_stencil[pipe_tex]) { 26428038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(pipe_tex, 0); 2658d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose 26628038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose ctx->fs_stencil[pipe_tex] = 26728038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose util_make_fragment_tex_shader_writestencil(ctx->pipe, tgsi_tex, 268740d490593e0de8732a697c9f77b90ddd463863bJordan Rose TGSI_INTERPOLATE_LINEAR); 269740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 270740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 271740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_set_fragment_shader_handle(ctx->cso, ctx->fs_stencil[pipe_tex]); 272740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} 273740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 274740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 275ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose/** 276ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose * Helper function to set the vertex shader. 277ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose */ 278ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosestatic INLINE void 279ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Roseset_vertex_shader(struct blit_state *ctx) 280ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose{ 281ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose /* vertex shader - still required to provide the linkage between 282ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose * fragment shader input semantics and vertex_element/buffers. 283972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose */ 284972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose if (!ctx->vs) { 285d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 286972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose TGSI_SEMANTIC_GENERIC }; 287972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose const uint semantic_indexes[] = { 0, 0 }; 288d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->vs = util_make_vertex_passthrough_shader(ctx->pipe, 2, 289972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose semantic_names, 290972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose semantic_indexes); 291972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose } 2926062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose 2936062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose cso_set_vertex_shader_handle(ctx->cso, ctx->vs); 2946062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose} 29585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose 29616e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks 29716e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks/** 29816e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks * Get offset of next free slot in vertex buffer for quad vertices. 299e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose */ 300740d490593e0de8732a697c9f77b90ddd463863bJordan Rosestatic unsigned 301740d490593e0de8732a697c9f77b90ddd463863bJordan Roseget_next_slot( struct blit_state *ctx ) 302740d490593e0de8732a697c9f77b90ddd463863bJordan Rose{ 303740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const unsigned max_slots = 4096 / sizeof ctx->vertices; 304e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 305e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose if (ctx->vbuf_slot >= max_slots) { 306e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose pipe_resource_reference(&ctx->vbuf, NULL); 307e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose ctx->vbuf_slot = 0; 308e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose } 309e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 310e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose if (!ctx->vbuf) { 311e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose ctx->vbuf = pipe_buffer_create(ctx->pipe->screen, 312e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose PIPE_BIND_VERTEX_BUFFER, 313e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose PIPE_USAGE_STREAM, 314e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose max_slots * sizeof ctx->vertices); 315e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose } 316e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 317e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose return ctx->vbuf_slot++ * sizeof ctx->vertices; 318e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose} 319e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 320ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 321e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose 322ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 323e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose/** 324740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Setup vertex data for the textured quad we'll draw. 325740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Note: y=0=top 326740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 327e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rosestatic unsigned 328e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rosesetup_vertex_data_tex(struct blit_state *ctx, 329e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose float x0, float y0, float x1, float y1, 330e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose float s0, float t0, float s1, float t1, 331e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose float z) 332740d490593e0de8732a697c9f77b90ddd463863bJordan Rose{ 333740d490593e0de8732a697c9f77b90ddd463863bJordan Rose unsigned offset; 334740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 335740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[0][0][0] = x0; 336e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose ctx->vertices[0][0][1] = y0; 337740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[0][0][2] = z; 338740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[0][1][0] = s0; /*s*/ 339740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[0][1][1] = t0; /*t*/ 340740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 3410ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose ctx->vertices[1][0][0] = x1; 342b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->vertices[1][0][1] = y0; 34342c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramer ctx->vertices[1][0][2] = z; 3440ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose ctx->vertices[1][1][0] = s1; /*s*/ 345740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[1][1][1] = t0; /*t*/ 346740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 347740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[2][0][0] = x1; 348b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->vertices[2][0][1] = y1; 349740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[2][0][2] = z; 350740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[2][1][0] = s1; 351740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->vertices[2][1][1] = t1; 352740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 353b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->vertices[3][0][0] = x0; 3547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->vertices[3][0][1] = y1; 3557c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->vertices[3][0][2] = z; 356b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->vertices[3][1][0] = s0; 3577c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->vertices[3][1][1] = t1; 3587c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 359972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose offset = get_next_slot( ctx ); 360740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 361740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (ctx->vbuf) { 362b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose pipe_buffer_write_nooverlap(ctx->pipe, ctx->vbuf, 363b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose offset, sizeof(ctx->vertices), ctx->vertices); 3647c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 3657c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 366b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose return offset; 367740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} 368ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek 369ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 370a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek/** 371a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek * \return TRUE if two regions overlap, FALSE otherwise 372a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek */ 373ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenekstatic boolean 374ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenekregions_overlap(int srcX0, int srcY0, 375ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek int srcX1, int srcY1, 376a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek int dstX0, int dstY0, 377a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek int dstX1, int dstY1) 378a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek{ 379a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek if (MAX2(srcX0, srcX1) < MIN2(dstX0, dstX1)) 380e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks return FALSE; /* src completely left of dst */ 381ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose 382ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose if (MAX2(dstX0, dstX1) < MIN2(srcX0, srcX1)) 3837c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return FALSE; /* dst completely left of src */ 384b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 385ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose if (MAX2(srcY0, srcY1) < MIN2(dstY0, dstY1)) 386ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose return FALSE; /* src completely above dst */ 387ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 388ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose if (MAX2(dstY0, dstY1) < MIN2(srcY0, srcY1)) 389ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose return FALSE; /* dst completely above src */ 390b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 391740d490593e0de8732a697c9f77b90ddd463863bJordan Rose return TRUE; /* some overlap */ 392740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} 393740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 394740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 395740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/** 396740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Can we blit from src format to dest format with a simple copy? 397645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose */ 398740d490593e0de8732a697c9f77b90ddd463863bJordan Rosestatic boolean 399740d490593e0de8732a697c9f77b90ddd463863bJordan Roseformats_compatible(enum pipe_format src_format, 400b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose enum pipe_format dst_format) 4017c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose{ 402972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose if (src_format == dst_format) { 403972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose return TRUE; 404740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 405740d490593e0de8732a697c9f77b90ddd463863bJordan Rose else { 4067c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose const struct util_format_description *src_desc = 407b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose util_format_description(src_format); 408b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose const struct util_format_description *dst_desc = 409740d490593e0de8732a697c9f77b90ddd463863bJordan Rose util_format_description(dst_format); 4107c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose return util_is_format_compatible(src_desc, dst_desc); 411740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 4127c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose} 4137c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 4147c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 415b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose/** 416740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Copy pixel block from src surface to dst surface. 417740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Overlapping regions are acceptable. 418740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * Flipping and stretching are supported. 419740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * \param filter one of PIPE_TEX_MIPFILTER_NEAREST/LINEAR 420740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * \param writemask controls which channels in the dest surface are sourced 421740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * from the src surface. Disabled channels are sourced 422740d490593e0de8732a697c9f77b90ddd463863bJordan Rose * from (0,0,0,1). 423740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 424740d490593e0de8732a697c9f77b90ddd463863bJordan Rosevoid 425740d490593e0de8732a697c9f77b90ddd463863bJordan Roseutil_blit_pixels(struct blit_state *ctx, 426740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_resource *src_tex, 427740d490593e0de8732a697c9f77b90ddd463863bJordan Rose unsigned src_level, 428d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose int srcX0, int srcY0, 429972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose int srcX1, int srcY1, 430d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose int srcZ0, 431740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_surface *dst, 432740d490593e0de8732a697c9f77b90ddd463863bJordan Rose int dstX0, int dstY0, 4337c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose int dstX1, int dstY1, 434740d490593e0de8732a697c9f77b90ddd463863bJordan Rose float z, uint filter, 435d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose uint writemask, uint zs_writemask) 436d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose{ 437d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_context *pipe = ctx->pipe; 438d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_screen *screen = pipe->screen; 4397c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose enum pipe_format src_format, dst_format; 440b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose struct pipe_sampler_view *sampler_view = NULL; 441740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_sampler_view sv_templ; 442740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_surface *dst_surface; 443740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_framebuffer_state fb; 444740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const int srcW = abs(srcX1 - srcX0); 445740d490593e0de8732a697c9f77b90ddd463863bJordan Rose const int srcH = abs(srcY1 - srcY0); 446645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose unsigned offset; 447645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose boolean overlap; 448645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose float s0, t0, s1, t1; 449645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose boolean normalized; 450645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose boolean is_stencil, is_depth, blit_depth, blit_stencil; 451645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const struct util_format_description *src_desc = 452645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose util_format_description(src_tex->format); 453645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 454645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose assert(filter == PIPE_TEX_MIPFILTER_NEAREST || 455645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose filter == PIPE_TEX_MIPFILTER_LINEAR); 456645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 457645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose assert(src_level <= src_tex->last_level); 458645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 459645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /* do the regions overlap? */ 460645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose overlap = src_tex == dst->texture && 461645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dst->u.tex.level == src_level && 462645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dst->u.tex.first_layer == srcZ0 && 463645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose regions_overlap(srcX0, srcY0, srcX1, srcY1, 464645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dstX0, dstY0, dstX1, dstY1); 465645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 466645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose src_format = util_format_linear(src_tex->format); 467645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dst_format = util_format_linear(dst->texture->format); 468645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 469645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /* See whether we will blit depth or stencil. */ 470645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose is_depth = util_format_has_depth(src_desc); 471645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose is_stencil = util_format_has_stencil(src_desc); 472645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 473645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose blit_depth = is_depth && (zs_writemask & BLIT_WRITEMASK_Z); 474645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose blit_stencil = is_stencil && (zs_writemask & BLIT_WRITEMASK_STENCIL); 475645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 476645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose assert((writemask && !zs_writemask && !is_depth && !is_stencil) || 477645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose (!writemask && (blit_depth || blit_stencil))); 478645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 479ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek /* 480645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose * Check for simple case: no format conversion, no flipping, no stretching, 481645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose * no overlapping, same number of samples. 482645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose * Filter mode should not matter since there's no stretching. 483645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose */ 484645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (formats_compatible(src_format, dst_format) && 485645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose src_tex->nr_samples == dst->texture->nr_samples && 486645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose is_stencil == blit_stencil && 487645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose is_depth == blit_depth && 488645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose srcX0 < srcX1 && 489645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dstX0 < dstX1 && 490645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose srcY0 < srcY1 && 491645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dstY0 < dstY1 && 492645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose (dstX1 - dstX0) == (srcX1 - srcX0) && 493645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose (dstY1 - dstY0) == (srcY1 - srcY0) && 494645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose !overlap) { 495645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose struct pipe_box src_box; 496c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose src_box.x = srcX0; 497c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose src_box.y = srcY0; 498645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose src_box.z = srcZ0; 499740d490593e0de8732a697c9f77b90ddd463863bJordan Rose src_box.width = srcW; 5007c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose src_box.height = srcH; 501740d490593e0de8732a697c9f77b90ddd463863bJordan Rose src_box.depth = 1; 502c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose pipe->resource_copy_region(pipe, 5037c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose dst->texture, dst->u.tex.level, 504645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dstX0, dstY0, dst->u.tex.first_layer,/* dest */ 505645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose src_tex, src_level, 506645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose &src_box); 507645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return; 508645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 509c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 510645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /* XXX Reading multisample textures is unimplemented. */ 511972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose assert(src_tex->nr_samples <= 1); 512c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose if (src_tex->nr_samples > 1) { 5139da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose return; 514645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 5159da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose 516ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose /* It's a mistake to call this function with a stencil format and 5176ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose * without shader stencil export. We don't do software fallbacks here. 518ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose * Ignore stencil and only copy depth. 519645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose */ 520645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (blit_stencil && !ctx->has_stencil_export) { 521ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek blit_stencil = FALSE; 522c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 523ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose if (!blit_depth) 524ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose return; 525ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose } 526c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 527c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose if (dst_format == dst->format) { 528c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose dst_surface = dst; 529c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose } else { 530c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose struct pipe_surface templ = *dst; 531c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose templ.format = dst_format; 532c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose dst_surface = pipe->create_surface(pipe, dst->texture, &templ); 533c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose } 534c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose 535c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose /* Create a temporary texture when src and dest alias. 536d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose */ 537972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose if (src_tex == dst_surface->texture && 538d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose dst_surface->u.tex.level == src_level && 539740d490593e0de8732a697c9f77b90ddd463863bJordan Rose dst_surface->u.tex.first_layer == srcZ0) { 540c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose /* Make a temporary texture which contains a copy of the source pixels. 5417c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose * Then we'll sample from the temporary texture. 542740d490593e0de8732a697c9f77b90ddd463863bJordan Rose */ 543d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_resource texTemp; 544d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_resource *tex; 545d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_sampler_view sv_templ; 546d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_box src_box; 5477c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose const int srcLeft = MIN2(srcX0, srcX1); 548645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose const int srcTop = MIN2(srcY0, srcY1); 549645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 550645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (srcLeft != srcX0) { 551645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /* left-right flip */ 552645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose int tmp = dstX0; 553645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dstX0 = dstX1; 554645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose dstX1 = tmp; 555645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 556645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 557645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (srcTop != srcY0) { 558645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose /* up-down flip */ 559740d490593e0de8732a697c9f77b90ddd463863bJordan Rose int tmp = dstY0; 560740d490593e0de8732a697c9f77b90ddd463863bJordan Rose dstY0 = dstY1; 5619da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose dstY1 = tmp; 56200b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose } 563ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek 5647c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose /* create temp texture */ 5657c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose memset(&texTemp, 0, sizeof(texTemp)); 566e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose texTemp.target = ctx->internal_target; 567740d490593e0de8732a697c9f77b90ddd463863bJordan Rose texTemp.format = src_format; 568740d490593e0de8732a697c9f77b90ddd463863bJordan Rose texTemp.last_level = 0; 569740d490593e0de8732a697c9f77b90ddd463863bJordan Rose texTemp.width0 = srcW; 570740d490593e0de8732a697c9f77b90ddd463863bJordan Rose texTemp.height0 = srcH; 571740d490593e0de8732a697c9f77b90ddd463863bJordan Rose texTemp.depth0 = 1; 572fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose texTemp.array_size = 1; 573fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose texTemp.bind = PIPE_BIND_SAMPLER_VIEW; 574fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose 575fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose tex = screen->resource_create(screen, &texTemp); 576c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose if (!tex) 577d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose return; 578d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 579972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose src_box.x = srcLeft; 580d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose src_box.y = srcTop; 581d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose src_box.z = srcZ0; 582d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose src_box.width = srcW; 583d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose src_box.height = srcH; 584972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose src_box.depth = 1; 585972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /* load temp texture */ 586972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose pipe->resource_copy_region(pipe, 587972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose tex, 0, 0, 0, 0, /* dest */ 588972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose src_tex, src_level, &src_box); 589972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 590fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose normalized = tex->target != PIPE_TEXTURE_RECT; 5917c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose if(normalized) { 592645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose s0 = 0.0f; 593fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose s1 = 1.0f; 594fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose t0 = 0.0f; 5957c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose t1 = 1.0f; 5967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 5977c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose else { 5987c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose s0 = 0; 599fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose s1 = srcW; 600fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose t0 = 0; 601fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose t1 = srcH; 6029da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose } 6037c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 6047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose u_sampler_view_default_template(&sv_templ, tex, tex->format); 605e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose if (!blit_depth && blit_stencil) { 606fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose /* set a stencil-only format, e.g. Z24S8 --> X24S8 */ 607fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose sv_templ.format = util_format_stencil_only(tex->format); 608fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose assert(sv_templ.format != PIPE_FORMAT_NONE); 609fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose } 610fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose sampler_view = pipe->create_sampler_view(pipe, tex, &sv_templ); 611645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 612740d490593e0de8732a697c9f77b90ddd463863bJordan Rose if (!sampler_view) { 613645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose pipe_resource_reference(&tex, NULL); 614645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose return; 615645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 616d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose pipe_resource_reference(&tex, NULL); 617d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 618740d490593e0de8732a697c9f77b90ddd463863bJordan Rose else { 619200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose /* Directly sample from the source resource/texture */ 620200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose u_sampler_view_default_template(&sv_templ, src_tex, src_format); 621645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (!blit_depth && blit_stencil) { 62269f87c956b3ac2b80124fd9604af012e1061473aJordan Rose /* set a stencil-only format, e.g. Z24S8 --> X24S8 */ 623645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose sv_templ.format = util_format_stencil_only(src_format); 624645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose assert(sv_templ.format != PIPE_FORMAT_NONE); 625645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose } 626645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose sampler_view = pipe->create_sampler_view(pipe, src_tex, &sv_templ); 627645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 628645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if (!sampler_view) { 629200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose return; 630200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose } 631645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 632200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose s0 = srcX0; 633645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose s1 = srcX1; 634740d490593e0de8732a697c9f77b90ddd463863bJordan Rose t0 = srcY0; 635740d490593e0de8732a697c9f77b90ddd463863bJordan Rose t1 = srcY1; 636645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose normalized = sampler_view->texture->target != PIPE_TEXTURE_RECT; 637645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose if(normalized) 638ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose { 639645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose s0 /= (float)(u_minify(sampler_view->texture->width0, src_level)); 640645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose s1 /= (float)(u_minify(sampler_view->texture->width0, src_level)); 641645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose t0 /= (float)(u_minify(sampler_view->texture->height0, src_level)); 642ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose t1 /= (float)(u_minify(sampler_view->texture->height0, src_level)); 643ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek } 644200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose } 645645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 646645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose assert(screen->is_format_supported(screen, sampler_view->format, 647b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->internal_target, sampler_view->texture->nr_samples, 648200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose PIPE_BIND_SAMPLER_VIEW)); 649200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose assert(screen->is_format_supported(screen, dst_format, ctx->internal_target, 650200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose dst_surface->texture->nr_samples, 651200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose is_depth || is_stencil ? PIPE_BIND_DEPTH_STENCIL : 652200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose PIPE_BIND_RENDER_TARGET)); 653645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose 654b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /* save state (restored below) */ 655740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_blend(ctx->cso); 656645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose cso_save_depth_stencil_alpha(ctx->cso); 657740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_rasterizer(ctx->cso); 658740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_sample_mask(ctx->cso); 659740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_samplers(ctx->cso, PIPE_SHADER_FRAGMENT); 660740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT); 661740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_stream_outputs(ctx->cso); 662740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_viewport(ctx->cso); 663740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_framebuffer(ctx->cso); 664d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_save_fragment_shader(ctx->cso); 665b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_save_vertex_shader(ctx->cso); 666d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_save_geometry_shader(ctx->cso); 667d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_save_vertex_elements(ctx->cso); 668d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_save_vertex_buffers(ctx->cso); 669d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 670d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* set misc state we care about */ 671d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose if (writemask) 672d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_set_blend(ctx->cso, &ctx->blend_write_color); 673d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose else 67470517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko cso_set_blend(ctx->cso, &ctx->blend_keep_color); 675740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 6767c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_set_sample_mask(ctx->cso, ~0); 67770517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko cso_set_rasterizer(ctx->cso, &ctx->rasterizer); 678b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_set_vertex_elements(ctx->cso, 2, ctx->velem); 679740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_set_stream_outputs(ctx->cso, 0, NULL, 0); 680d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 681d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* default sampler state */ 682d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->sampler.normalized_coords = normalized; 683d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->sampler.min_img_filter = filter; 684d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->sampler.mag_img_filter = filter; 685d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->sampler.min_lod = src_level; 6867c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->sampler.max_lod = src_level; 687b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 688b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /* Depth stencil state, fragment shader and sampler setup depending on what 689b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose * we blit. 6907c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose */ 691b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose if (blit_depth && blit_stencil) { 692740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_single_sampler(ctx->cso, PIPE_SHADER_FRAGMENT, 0, &ctx->sampler); 693740d490593e0de8732a697c9f77b90ddd463863bJordan Rose /* don't filter stencil */ 6947c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; 695740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; 6967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_single_sampler(ctx->cso, PIPE_SHADER_FRAGMENT, 1, &ctx->sampler); 697b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 698740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_set_depth_stencil_alpha(ctx->cso, &ctx->dsa_write_depthstencil); 699740d490593e0de8732a697c9f77b90ddd463863bJordan Rose set_depthstencil_fragment_shader(ctx, sampler_view->texture->target); 700ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose } 701645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose else if (blit_depth) { 7027c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_single_sampler(ctx->cso, PIPE_SHADER_FRAGMENT, 0, &ctx->sampler); 703ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose cso_set_depth_stencil_alpha(ctx->cso, &ctx->dsa_write_depth); 704ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose set_depth_fragment_shader(ctx, sampler_view->texture->target); 705ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose } 7067c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose else if (blit_stencil) { 707e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose /* don't filter stencil */ 708740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; 709740d490593e0de8732a697c9f77b90ddd463863bJordan Rose ctx->sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; 710740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_single_sampler(ctx->cso, PIPE_SHADER_FRAGMENT, 0, &ctx->sampler); 711740d490593e0de8732a697c9f77b90ddd463863bJordan Rose 712740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_set_depth_stencil_alpha(ctx->cso, &ctx->dsa_write_stencil); 7130e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose set_stencil_fragment_shader(ctx, sampler_view->texture->target); 7140e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose } 7150e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose else { /* color */ 71670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose cso_single_sampler(ctx->cso, PIPE_SHADER_FRAGMENT, 0, &ctx->sampler); 717d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_set_depth_stencil_alpha(ctx->cso, &ctx->dsa_keep_depthstencil); 718972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose set_fragment_shader(ctx, writemask, sampler_view->texture->target); 719d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose } 720b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_single_sampler_done(ctx->cso, PIPE_SHADER_FRAGMENT); 72170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 7227c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose /* textures */ 72370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose if (blit_depth && blit_stencil) { 724d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* Setup two samplers, one for depth and the other one for stencil. */ 725d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_sampler_view templ; 726d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose struct pipe_sampler_view *views[2]; 727d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 7287c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose templ = *sampler_view; 729b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose templ.format = util_format_stencil_only(templ.format); 730b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose assert(templ.format != PIPE_FORMAT_NONE); 731b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 7327c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose views[0] = sampler_view; 733b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose views[1] = pipe->create_sampler_view(pipe, views[0]->texture, &templ); 73470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose cso_set_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT, 2, views); 73570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 7367c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose pipe_sampler_view_reference(&views[1], NULL); 737b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose } 738b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose else { 73970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose cso_set_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT, 1, &sampler_view); 7407c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose } 74170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 74270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose /* viewport */ 74370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose ctx->viewport.scale[0] = 0.5f * dst_surface->width; 744b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->viewport.scale[1] = 0.5f * dst_surface->height; 74570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose ctx->viewport.scale[2] = 0.5f; 74670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose ctx->viewport.scale[3] = 1.0f; 7477c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose ctx->viewport.translate[0] = 0.5f * dst_surface->width; 748b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose ctx->viewport.translate[1] = 0.5f * dst_surface->height; 74970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose ctx->viewport.translate[2] = 0.5f; 75070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose ctx->viewport.translate[3] = 0.0f; 75170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose cso_set_viewport(ctx->cso, &ctx->viewport); 75270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose 75370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose set_vertex_shader(ctx); 7548919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose cso_set_geometry_shader_handle(ctx->cso, NULL); 7558919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 7568919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose /* drawing dest */ 7578919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose memset(&fb, 0, sizeof(fb)); 7588919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose fb.width = dst_surface->width; 7598919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose fb.height = dst_surface->height; 7608919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose if (blit_depth || blit_stencil) { 7618919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose fb.zsbuf = dst_surface; 7628919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } else { 7638919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose fb.nr_cbufs = 1; 764cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose fb.cbufs[0] = dst_surface; 7658919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose } 7668919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose cso_set_framebuffer(ctx->cso, &fb); 767cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose 768d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* draw quad */ 769d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose offset = setup_vertex_data_tex(ctx, 7708919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose (float) dstX0 / dst_surface->width * 2.0f - 1.0f, 771cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose (float) dstY0 / dst_surface->height * 2.0f - 1.0f, 7728919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose (float) dstX1 / dst_surface->width * 2.0f - 1.0f, 773d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose (float) dstY1 / dst_surface->height * 2.0f - 1.0f, 774d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose s0, t0, 775d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose s1, t1, 776d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose z); 777d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 778d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose if (ctx->vbuf) { 779972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose util_draw_vertex_buffer(ctx->pipe, ctx->cso, ctx->vbuf, offset, 780972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose PIPE_PRIM_TRIANGLE_FAN, 781972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 4, /* verts */ 7827c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 2); /* attribs/vert */ 783740d490593e0de8732a697c9f77b90ddd463863bJordan Rose } 7843f558af01643787d209a133215b0abec81b5fe30Anna Zaks 7853f558af01643787d209a133215b0abec81b5fe30Anna Zaks /* restore state we changed */ 7863f558af01643787d209a133215b0abec81b5fe30Anna Zaks cso_restore_blend(ctx->cso); 7873f558af01643787d209a133215b0abec81b5fe30Anna Zaks cso_restore_depth_stencil_alpha(ctx->cso); 788740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_restore_rasterizer(ctx->cso); 7897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_restore_sample_mask(ctx->cso); 7908919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose cso_restore_samplers(ctx->cso, PIPE_SHADER_FRAGMENT); 791cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose cso_restore_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT); 7927c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_restore_viewport(ctx->cso); 793b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_restore_framebuffer(ctx->cso); 794b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_restore_fragment_shader(ctx->cso); 7957c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_restore_vertex_shader(ctx->cso); 796b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_restore_geometry_shader(ctx->cso); 797b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_restore_vertex_elements(ctx->cso); 7987c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose cso_restore_vertex_buffers(ctx->cso); 799b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose cso_restore_stream_outputs(ctx->cso); 800b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose 801740d490593e0de8732a697c9f77b90ddd463863bJordan Rose pipe_sampler_view_reference(&sampler_view, NULL); 8028919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose if (dst_surface != dst) 8038919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose pipe_surface_reference(&dst_surface, NULL); 8048919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose} 8058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 8068919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 8078919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/** 8088919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose * Copy pixel block from src texture to dst surface. 8098919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose * The sampler view's first_level field indicates the source 8108919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose * mipmap level to use. 8118919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose * XXX need some control over blitting Z and/or stencil. 8127c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose */ 8138919e688dc610d1f632a4d43f7f1489f67255476Jordan Rosevoid 8140e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Roseutil_blit_pixels_tex(struct blit_state *ctx, 815740d490593e0de8732a697c9f77b90ddd463863bJordan Rose struct pipe_sampler_view *src_sampler_view, 816740d490593e0de8732a697c9f77b90ddd463863bJordan Rose int srcX0, int srcY0, 8175a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks int srcX1, int srcY1, 8185a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks struct pipe_surface *dst, 8195a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks int dstX0, int dstY0, 8200e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose int dstX1, int dstY1, 8210e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose float z, uint filter) 8220e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose{ 8230e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose boolean normalized = src_sampler_view->texture->target != PIPE_TEXTURE_RECT; 824cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose struct pipe_framebuffer_state fb; 825b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose float s0, t0, s1, t1; 826cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose unsigned offset; 827cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose struct pipe_resource *tex = src_sampler_view->texture; 8285a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks 8295a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks assert(filter == PIPE_TEX_MIPFILTER_NEAREST || 8305a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks filter == PIPE_TEX_MIPFILTER_LINEAR); 83109647f28d7955d0c948ebbbb376a46844056f11aJordan Rose 83209647f28d7955d0c948ebbbb376a46844056f11aJordan Rose assert(tex); 8338919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose assert(tex->width0 != 0); 8348919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose assert(tex->height0 != 0); 83509647f28d7955d0c948ebbbb376a46844056f11aJordan Rose 83609647f28d7955d0c948ebbbb376a46844056f11aJordan Rose s0 = srcX0; 8378919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose s1 = srcX1; 8388919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose t0 = srcY0; 8398919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose t1 = srcY1; 8408919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose 8418919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose if(normalized) 8428919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose { 8438919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose /* normalize according to the mipmap level's size */ 8448919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose int level = src_sampler_view->u.tex.first_level; 8458919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose float w = (float) u_minify(tex->width0, level); 8468919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose float h = (float) u_minify(tex->height0, level); 847740d490593e0de8732a697c9f77b90ddd463863bJordan Rose s0 /= w; 848740d490593e0de8732a697c9f77b90ddd463863bJordan Rose s1 /= w; 849ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek t0 /= h; 850ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose t1 /= h; 851ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose } 852ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose 853ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose assert(ctx->pipe->screen->is_format_supported(ctx->pipe->screen, dst->format, 854ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose PIPE_TEXTURE_2D, 855ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose dst->texture->nr_samples, 856b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose PIPE_BIND_RENDER_TARGET)); 8577c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose 858b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose /* save state (restored below) */ 859740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_blend(ctx->cso); 860740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_depth_stencil_alpha(ctx->cso); 861740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_rasterizer(ctx->cso); 862740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_sample_mask(ctx->cso); 863740d490593e0de8732a697c9f77b90ddd463863bJordan Rose cso_save_samplers(ctx->cso, PIPE_SHADER_FRAGMENT); 864972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT); 865972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_stream_outputs(ctx->cso); 866972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_viewport(ctx->cso); 867972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_framebuffer(ctx->cso); 868972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_fragment_shader(ctx->cso); 869972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_vertex_shader(ctx->cso); 870972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_geometry_shader(ctx->cso); 871972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_vertex_elements(ctx->cso); 872972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_save_vertex_buffers(ctx->cso); 873972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 874972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /* set misc state we care about */ 875972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_set_blend(ctx->cso, &ctx->blend_write_color); 876d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_set_depth_stencil_alpha(ctx->cso, &ctx->dsa_keep_depthstencil); 877972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_set_sample_mask(ctx->cso, ~0); 878972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_set_rasterizer(ctx->cso, &ctx->rasterizer); 879972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_set_vertex_elements(ctx->cso, 2, ctx->velem); 880972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_set_stream_outputs(ctx->cso, 0, NULL, 0); 881972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 882972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /* sampler */ 883972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->sampler.normalized_coords = normalized; 884972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->sampler.min_img_filter = filter; 885972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose ctx->sampler.mag_img_filter = filter; 886972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_single_sampler(ctx->cso, PIPE_SHADER_FRAGMENT, 0, &ctx->sampler); 887972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose cso_single_sampler_done(ctx->cso, PIPE_SHADER_FRAGMENT); 888972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose 889972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose /* viewport */ 890d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.scale[0] = 0.5f * dst->width; 891d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.scale[1] = 0.5f * dst->height; 892d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.scale[2] = 0.5f; 893d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.scale[3] = 1.0f; 894d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.translate[0] = 0.5f * dst->width; 895d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.translate[1] = 0.5f * dst->height; 896d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.translate[2] = 0.5f; 897d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->viewport.translate[3] = 0.0f; 898d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_set_viewport(ctx->cso, &ctx->viewport); 899d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 900d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* texture */ 901d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_set_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT, 1, &src_sampler_view); 902d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 903d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* shaders */ 904d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose set_fragment_shader(ctx, TGSI_WRITEMASK_XYZW, 905d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose src_sampler_view->texture->target); 906200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose set_vertex_shader(ctx); 907200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose cso_set_geometry_shader_handle(ctx->cso, NULL); 908200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose 909200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose /* drawing dest */ 910200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose memset(&fb, 0, sizeof(fb)); 911200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose fb.width = dst->width; 912200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose fb.height = dst->height; 913972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose fb.nr_cbufs = 1; 914972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose fb.cbufs[0] = dst; 915d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_set_framebuffer(ctx->cso, &fb); 91657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose 91757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose /* draw quad */ 91857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose offset = setup_vertex_data_tex(ctx, 91957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose (float) dstX0 / dst->width * 2.0f - 1.0f, 92057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose (float) dstY0 / dst->height * 2.0f - 1.0f, 921645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose (float) dstX1 / dst->width * 2.0f - 1.0f, 922d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose (float) dstY1 / dst->height * 2.0f - 1.0f, 923d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose s0, t0, s1, t1, 924d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose z); 925d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 926d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose util_draw_vertex_buffer(ctx->pipe, ctx->cso, 927d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose ctx->vbuf, offset, 928d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose PIPE_PRIM_TRIANGLE_FAN, 929d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 4, /* verts */ 930d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 2); /* attribs/vert */ 931d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose 932d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose /* restore state we changed */ 933d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_blend(ctx->cso); 934d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_depth_stencil_alpha(ctx->cso); 935d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_rasterizer(ctx->cso); 936d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_sample_mask(ctx->cso); 937d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_samplers(ctx->cso, PIPE_SHADER_FRAGMENT); 938d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_sampler_views(ctx->cso, PIPE_SHADER_FRAGMENT); 939200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose cso_restore_viewport(ctx->cso); 940200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose cso_restore_framebuffer(ctx->cso); 941200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose cso_restore_fragment_shader(ctx->cso); 942d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_vertex_shader(ctx->cso); 943d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_geometry_shader(ctx->cso); 944d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_vertex_elements(ctx->cso); 945d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_vertex_buffers(ctx->cso); 946d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose cso_restore_stream_outputs(ctx->cso); 947d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose} 948d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose