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