mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
Cell: initial texture cache/sampling code
This commit is contained in:
parent
7c596b8011
commit
2f868411a2
2 changed files with 182 additions and 0 deletions
139
src/mesa/pipe/cell/spu/spu_texture.c
Normal file
139
src/mesa/pipe/cell/spu/spu_texture.c
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
#include "spu_main.h"
|
||||
#include "spu_texture.h"
|
||||
#include "spu_tile.h"
|
||||
|
||||
|
||||
/**
|
||||
* Number of texture tiles to cache.
|
||||
* Note that this will probably be the largest consumer of SPU local store/
|
||||
* memory for this driver!
|
||||
*/
|
||||
#define CACHE_SIZE 16
|
||||
|
||||
static tile_t tex_tiles[CACHE_SIZE] ALIGN16_ATTRIB;
|
||||
|
||||
static int tex_tile_x[CACHE_SIZE], tex_tile_y[CACHE_SIZE];
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Mark all tex cache entries as invalid.
|
||||
*/
|
||||
void
|
||||
invalidate_tex_cache(void)
|
||||
{
|
||||
/* XXX memset? */
|
||||
uint i;
|
||||
for (i = 0; i < CACHE_SIZE; i++)
|
||||
tex_tile_x[i] = tex_tile_y[i] = -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the cache pos/index which corresponds to texel (i,j)
|
||||
*/
|
||||
static INLINE uint
|
||||
cache_pos(uint i, uint j)
|
||||
{
|
||||
uint tx = i / TILE_SIZE;
|
||||
uint ty = j / TILE_SIZE;
|
||||
uint pos = (tx + ty * 4) % CACHE_SIZE;
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make sure the tile for texel (i,j) is present, return its position/index
|
||||
* in the cache.
|
||||
*/
|
||||
static uint
|
||||
get_tex_tile(uint i, uint j)
|
||||
{
|
||||
const int tx = i / TILE_SIZE;
|
||||
const int ty = j / TILE_SIZE;
|
||||
const uint pos = cache_pos(i, j);
|
||||
|
||||
if (tex_tile_x[pos] != tx || tex_tile_y[pos] != ty) {
|
||||
/* texture cache miss, fetch tile from main memory */
|
||||
const uint tiles_per_row = spu.texture.width / TILE_SIZE;
|
||||
const uint bytes_per_tile = sizeof(tile_t);
|
||||
const void *src = (const ubyte *) spu.texture.start
|
||||
+ (ty * tiles_per_row + tx) * bytes_per_tile;
|
||||
|
||||
printf("SPU %u: tex cache miss at %d, %d pos=%u old=%d,%d\n",
|
||||
spu.init.id, tx, ty, pos,
|
||||
tex_tile_x[pos], tex_tile_y[pos]);
|
||||
#if 0
|
||||
printf("SPU %u: get tex tile from %p to %p\n",
|
||||
spu.init.id, src, tex_tiles[pos].t32);
|
||||
#endif
|
||||
|
||||
ASSERT_ALIGN16(tex_tiles[pos].t32);
|
||||
ASSERT_ALIGN16(src);
|
||||
|
||||
mfc_get(tex_tiles[pos].t32, /* dest */
|
||||
(unsigned int) src,
|
||||
bytes_per_tile, /* size */
|
||||
TAG_TEXTURE_TILE,
|
||||
0, /* tid */
|
||||
0 /* rid */);
|
||||
|
||||
wait_on_mask(1 << TAG_TEXTURE_TILE);
|
||||
|
||||
tex_tile_x[pos] = tx;
|
||||
tex_tile_y[pos] = ty;
|
||||
}
|
||||
else {
|
||||
#if 0
|
||||
printf("SPU %u: tex cache HIT at %d, %d\n",
|
||||
spu.init.id, tx, ty);
|
||||
#endif
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get texture sample at texcoord.
|
||||
* XXX this is extremely primitive for now.
|
||||
*/
|
||||
uint
|
||||
sample_texture(const float *texcoord)
|
||||
{
|
||||
/* wrap/repeat */
|
||||
uint i = (uint) (texcoord[0] * spu.texture.width) % spu.texture.width;
|
||||
uint j = (uint) (texcoord[1] * spu.texture.height) % spu.texture.height;
|
||||
uint pos = get_tex_tile(i, j);
|
||||
uint texel = tex_tiles[pos].t32[j % TILE_SIZE][i % TILE_SIZE];
|
||||
return texel;
|
||||
}
|
||||
43
src/mesa/pipe/cell/spu/spu_texture.h
Normal file
43
src/mesa/pipe/cell/spu/spu_texture.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef SPU_TEXTURE_H
|
||||
#define SPU_TEXTURE_H
|
||||
|
||||
|
||||
#include "pipe/p_compiler.h"
|
||||
|
||||
|
||||
extern void
|
||||
invalidate_tex_cache(void);
|
||||
|
||||
|
||||
extern uint
|
||||
sample_texture(const float *texcoord);
|
||||
|
||||
|
||||
#endif /* SPU_TEXTURE_H */
|
||||
Loading…
Add table
Reference in a new issue