1 /**************************************************************************
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
35 * Get tile of color or Z values from main memory, put into SPU memory.
38 get_tile(uint tx
, uint ty
, tile_t
*tile
, int tag
, int zBuf
)
40 const uint offset
= ty
* spu
.fb
.width_tiles
+ tx
;
41 const uint bytesPerTile
= TILE_SIZE
* TILE_SIZE
* (zBuf
? spu
.fb
.zsize
: 4);
42 const ubyte
*src
= zBuf
? spu
.fb
.depth_start
: spu
.fb
.color_start
;
44 src
+= offset
* bytesPerTile
;
46 ASSERT(tx
< spu
.fb
.width_tiles
);
47 ASSERT(ty
< spu
.fb
.height_tiles
);
50 printf("get_tile: dest: %p src: 0x%x size: %d\n",
51 tile, (unsigned int) src, bytesPerTile);
53 mfc_get(tile
->ui
, /* dest in local memory */
54 (unsigned int) src
, /* src in main memory */
63 * Move tile of color or Z values from SPU memory to main memory.
66 put_tile(uint tx
, uint ty
, const tile_t
*tile
, int tag
, int zBuf
)
68 const uint offset
= ty
* spu
.fb
.width_tiles
+ tx
;
69 const uint bytesPerTile
= TILE_SIZE
* TILE_SIZE
* (zBuf
? spu
.fb
.zsize
: 4);
70 ubyte
*dst
= zBuf
? spu
.fb
.depth_start
: spu
.fb
.color_start
;
72 dst
+= offset
* bytesPerTile
;
74 ASSERT(tx
< spu
.fb
.width_tiles
);
75 ASSERT(ty
< spu
.fb
.height_tiles
);
78 printf("SPU %u: put_tile: src: %p dst: 0x%x size: %d\n",
80 tile, (unsigned int) dst, bytesPerTile);
82 mfc_put((void *) tile
->ui
, /* src in local memory */
83 (unsigned int) dst
, /* dst in main memory */
92 * For tiles whose status is TILE_STATUS_CLEAR, write solid-filled
93 * tiles back to the main framebuffer.
96 really_clear_tiles(uint surfaceIndex
)
98 const uint num_tiles
= spu
.fb
.width_tiles
* spu
.fb
.height_tiles
;
101 if (surfaceIndex
== 0) {
102 clear_c_tile(&spu
.ctile
);
104 for (i
= spu
.init
.id
; i
< num_tiles
; i
+= spu
.init
.num_spus
) {
105 uint tx
= i
% spu
.fb
.width_tiles
;
106 uint ty
= i
/ spu
.fb
.width_tiles
;
107 if (spu
.ctile_status
[ty
][tx
] == TILE_STATUS_CLEAR
) {
108 put_tile(tx
, ty
, &spu
.ctile
, TAG_SURFACE_CLEAR
, 0);
113 clear_z_tile(&spu
.ztile
);
115 for (i
= spu
.init
.id
; i
< num_tiles
; i
+= spu
.init
.num_spus
) {
116 uint tx
= i
% spu
.fb
.width_tiles
;
117 uint ty
= i
/ spu
.fb
.width_tiles
;
118 if (spu
.ztile_status
[ty
][tx
] == TILE_STATUS_CLEAR
)
119 put_tile(tx
, ty
, &spu
.ctile
, TAG_SURFACE_CLEAR
, 1);
124 wait_on_mask(1 << TAG_SURFACE_CLEAR
);