i915_surface.c revision c76efb96b405e43e3261d1dc9e8812fdb2cfbac8
101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell/**************************************************************************
201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * All Rights Reserved.
501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * copy of this software and associated documentation files (the
801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * "Software"), to deal in the Software without restriction, including
901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
1001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
1101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to
1201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * the following conditions:
1301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
1401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * The above copyright notice and this permission notice (including the
1501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * next paragraph) shall be included in all copies or substantial portions
1601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * of the Software.
1701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
1801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2301c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2401c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2501c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell *
2601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell **************************************************************************/
2701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
2801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_context.h"
2911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer#include "i915_blit.h"
3001c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "i915_state.h"
3101c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell#include "pipe/p_defines.h"
32b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer#include "pipe/p_inlines.h"
3340a86b20478024ca7c55400019c536cb5ff631d1Keith Whitwell#include "pipe/p_util.h"
347de874ec2c7b9e3aff7f81b7e30045b45381fbadMichal Krol#include "pipe/p_inlines.h"
35e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian#include "pipe/p_winsys.h"
36263e8f057290961c9dd603ffa69f25a7a253301aBrian#include "pipe/util/p_tile.h"
3701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
3801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
39e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian/*
40e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian * XXX note: same as code in sp_surface.c
41e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian */
42e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brianstatic struct pipe_surface *
43e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Briani915_get_tex_surface(struct pipe_context *pipe,
44753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer                     struct pipe_texture *pt,
45e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian                     unsigned face, unsigned level, unsigned zslice)
46e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian{
47753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   struct i915_texture *tex = (struct i915_texture *)pt;
48e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   struct pipe_surface *ps;
49e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   unsigned offset;  /* in bytes */
507523f490b0166b00e24429c33f8958c3be72ccb5Brian
51753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   offset = tex->level_offset[level];
5201c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
53753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   if (pt->target == PIPE_TEXTURE_CUBE) {
54753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      offset += tex->image_offset[level][face] * pt->cpp;
55e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   }
56753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer   else if (pt->target == PIPE_TEXTURE_3D) {
57753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      offset += tex->image_offset[level][zslice] * pt->cpp;
58e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   }
59e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   else {
60e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian      assert(face == 0);
61e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian      assert(zslice == 0);
62e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   }
63e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian
6412363674e5aa39b780020339038186b7715bd4b2José Fonseca   ps = pipe->winsys->surface_alloc(pipe->winsys);
65e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   if (ps) {
66e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian      assert(ps->refcount);
67b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer      pipe->winsys->buffer_reference(pipe->winsys, &ps->buffer, tex->buffer);
6812363674e5aa39b780020339038186b7715bd4b2José Fonseca      ps->format = pt->format;
69753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      ps->cpp = pt->cpp;
70753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      ps->width = pt->width[level];
71753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      ps->height = pt->height[level];
72753db0d8407147393a7b0622ae3fa28f68d0353dMichel Dänzer      ps->pitch = tex->pitch;
73e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian      ps->offset = offset;
74e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   }
75e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   return ps;
7601c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
7701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
7801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell
7911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzerstatic void
8047b5138d2d6533ac1cd818713fd0678ec3c7aa1bBriancopy_rect(ubyte * dst,
8147b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned cpp,
8247b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned dst_pitch,
8347b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned dst_x,
8447b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned dst_y,
8547b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned width,
8647b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned height,
8747b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          const ubyte *src,
8847b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned src_pitch,
8947b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned src_x,
9047b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian          unsigned src_y)
9111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{
9211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   unsigned i;
9311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
9411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   dst_pitch *= cpp;
9511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   src_pitch *= cpp;
9611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   dst += dst_x * cpp;
9711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   src += src_x * cpp;
9811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   dst += dst_y * dst_pitch;
9911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   src += src_y * dst_pitch;
10011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   width *= cpp;
10111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
10211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   if (width == dst_pitch && width == src_pitch)
10311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      memcpy(dst, src, height * width);
10411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   else {
10511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      for (i = 0; i < height; i++) {
10611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer         memcpy(dst, src, width);
10711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer         dst += dst_pitch;
10811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer         src += src_pitch;
10911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      }
11011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   }
11111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer}
11211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
11311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
11411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer/* Upload data to a rectangular sub-region.  Lots of choices how to do this:
11511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer *
11611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer * - memcpy by span to current destination
11711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer * - upload data as new buffer and blit
11811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer *
11911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer * Currently always memcpy.
12011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer */
12111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzerstatic void
12211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzeri915_surface_data(struct pipe_context *pipe,
12311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  struct pipe_surface *dst,
12411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  unsigned dstx, unsigned dsty,
12511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  const void *src, unsigned src_pitch,
12611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  unsigned srcx, unsigned srcy, unsigned width, unsigned height)
12711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{
12847b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian   copy_rect(pipe_surface_map(dst),
12947b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian             dst->cpp, dst->pitch,
13047b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian             dstx, dsty, width, height, src, src_pitch, srcx, srcy);
13111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
132b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer   pipe_surface_unmap(dst);
13311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer}
13411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
13511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
13611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer/* Assumes all values are within bounds -- no checking at this level -
13711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer * do it higher up if required.
13811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer */
13911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzerstatic void
14011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzeri915_surface_copy(struct pipe_context *pipe,
14111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  struct pipe_surface *dst,
14211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  unsigned dstx, unsigned dsty,
14311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  struct pipe_surface *src,
14411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  unsigned srcx, unsigned srcy, unsigned width, unsigned height)
14511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{
14611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   assert( dst != src );
14711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   assert( dst->cpp == src->cpp );
14811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
14911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   if (0) {
15047b5138d2d6533ac1cd818713fd0678ec3c7aa1bBrian      copy_rect(pipe_surface_map(dst),
15111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      dst->cpp,
15211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      dst->pitch,
15311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      dstx, dsty,
15411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      width, height,
155b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer		      pipe_surface_map(src),
15611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      src->pitch,
15711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      srcx, srcy);
15811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
159b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer      pipe_surface_unmap(src);
160b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer      pipe_surface_unmap(dst);
16111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   }
16211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   else {
16311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      i915_copy_blit( i915_context(pipe),
16411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      dst->cpp,
165b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer		      (short) src->pitch, src->buffer, src->offset,
166b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer		      (short) dst->pitch, dst->buffer, dst->offset,
16711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      (short) srcx, (short) srcy, (short) dstx, (short) dsty, (short) width, (short) height );
16811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   }
16911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer}
17011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
17111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer/* Fill a rectangular sub-region.  Need better logic about when to
17211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer * push buffers into AGP - will currently do so whenever possible.
17311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer */
174c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzerstatic void *
175c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzerget_pointer(struct pipe_surface *dst, void *dst_map, unsigned x, unsigned y)
17611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{
177c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer   return (char *)dst_map + (y * dst->pitch + x) * dst->cpp;
17811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer}
17911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
18011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
18111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzerstatic void
18211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzeri915_surface_fill(struct pipe_context *pipe,
18311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  struct pipe_surface *dst,
18411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  unsigned dstx, unsigned dsty,
18511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		  unsigned width, unsigned height, unsigned value)
18611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer{
18711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   if (0) {
18811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      unsigned i, j;
189c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer      void *dst_map = pipe_surface_map(dst);
19011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
19111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      switch (dst->cpp) {
19211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      case 1: {
193c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer	 ubyte *row = get_pointer(dst, dst_map, dstx, dsty);
19411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 for (i = 0; i < height; i++) {
19511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	    memset(row, value, width);
19611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	    row += dst->pitch;
19711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 }
19811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      }
19911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 break;
20011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      case 2: {
201c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer	 ushort *row = get_pointer(dst, dst_map, dstx, dsty);
20211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 for (i = 0; i < height; i++) {
20311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	    for (j = 0; j < width; j++)
20411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	       row[j] = (ushort) value;
20511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	    row += dst->pitch;
20611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 }
20711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      }
20811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 break;
20911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      case 4: {
210c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer	 unsigned *row = get_pointer(dst, dst_map, dstx, dsty);
21111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 for (i = 0; i < height; i++) {
21211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	    for (j = 0; j < width; j++)
21311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	       row[j] = value;
21411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	    row += dst->pitch;
21511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 }
21611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      }
21711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 break;
21811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      default:
21911a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 assert(0);
22011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer	 break;
22111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      }
222c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer
223c76efb96b405e43e3261d1dc9e8812fdb2cfbac8Michel Dänzer      pipe_surface_unmap( dst );
22411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   }
22511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   else {
22611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer      i915_fill_blit( i915_context(pipe),
22711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      dst->cpp,
22811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      (short) dst->pitch,
229b859cdf6f191b4d8b56537c8dc30082a7e2d94b3Michel Dänzer		      dst->buffer, dst->offset,
23011a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      (short) dstx, (short) dsty,
23111a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      (short) width, (short) height,
23211a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer		      value );
23311a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   }
23411a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer}
23511a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
23611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer
23701c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwellvoid
23801c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwelli915_init_surface_functions(struct i915_context *i915)
23901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell{
240e4f6f0ec02133e9297c3f2db787dee14bf0ae6e1Brian   i915->pipe.get_tex_surface = i915_get_tex_surface;
241263e8f057290961c9dd603ffa69f25a7a253301aBrian   i915->pipe.get_tile = pipe_get_tile_raw;
242263e8f057290961c9dd603ffa69f25a7a253301aBrian   i915->pipe.put_tile = pipe_put_tile_raw;
243263e8f057290961c9dd603ffa69f25a7a253301aBrian   i915->pipe.get_tile_rgba = pipe_get_tile_rgba;
244263e8f057290961c9dd603ffa69f25a7a253301aBrian   i915->pipe.put_tile_rgba = pipe_put_tile_rgba;
2454416514aa82e59eae559b59e49846931fdf85f56Brian
24611a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   i915->pipe.surface_data = i915_surface_data;
24711a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   i915->pipe.surface_copy = i915_surface_copy;
24811a80160fd60d1eb1541b49128c659526a5d8ac8Michel Dänzer   i915->pipe.surface_fill = i915_surface_fill;
24901c35b52a1fccbe4253a96b9c0506ef6c991e44fKeith Whitwell}
250