tiny softrasterizer speedups: change texcache to produce different pixel formats depending on 3d renderer, and optimize getline
This commit is contained in:
parent
5abdb2faed
commit
5f22118a6f
|
@ -536,7 +536,7 @@ static void setTexture(unsigned int format, unsigned int texpal)
|
|||
}
|
||||
|
||||
|
||||
TexCache_SetTexture(format, texpal);
|
||||
TexCache_SetTexture<TexFormat_32bpp>(format, texpal);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -79,6 +79,11 @@ CACHE_ALIGN const u8 material_3bit_to_8bit[] = {
|
|||
0x00, 0x24, 0x49, 0x6D, 0x92, 0xB6, 0xDB, 0xFF
|
||||
};
|
||||
|
||||
//maybe not very precise
|
||||
CACHE_ALIGN const u8 material_3bit_to_5bit[] = {
|
||||
0, 4, 8, 13, 17, 22, 26, 31
|
||||
};
|
||||
|
||||
CACHE_ALIGN const u8 alpha_5bit_to_4bit[] = {
|
||||
0x00, 0x00,
|
||||
0x01, 0x01,
|
||||
|
|
|
@ -33,6 +33,9 @@
|
|||
//produce a 32bpp color from a ds RGB15 plus an 8bit alpha, using a table
|
||||
#define RGB15TO32(col,alpha8) ( ((alpha8)<<24) | color_15bit_to_24bit[col&0x7FFF] )
|
||||
|
||||
//produce a 5555 32bit color from a ds RGB15 plus an 5bit alpha
|
||||
#define RGB15TO5555(col,alpha5) (((alpha5)<<24) | ((((col) & 0x7C00)>>10)<<16) | ((((col) & 0x3E0)>>5)<<8) | (((col) & 0x1F)))
|
||||
|
||||
//produce a 24bpp color from a ds RGB15, using a table
|
||||
#define RGB15TO24_REVERSE(col) ( color_15bit_to_24bit_reverse[col&0x7FFF] )
|
||||
|
||||
|
@ -183,6 +186,7 @@ extern CACHE_ALIGN u16 color_15bit_to_16bit_reverse[32768];
|
|||
extern CACHE_ALIGN u8 mixTable555[32][32][32];
|
||||
extern CACHE_ALIGN const int material_5bit_to_31bit[32];
|
||||
extern CACHE_ALIGN const u8 material_5bit_to_8bit[32];
|
||||
extern CACHE_ALIGN const u8 material_3bit_to_5bit[8];
|
||||
extern CACHE_ALIGN const u8 material_3bit_to_8bit[8];
|
||||
extern CACHE_ALIGN const u8 alpha_5bit_to_4bit[32];
|
||||
|
||||
|
|
|
@ -309,12 +309,7 @@ static struct Sampler
|
|||
dowrap(iu,iv);
|
||||
|
||||
Fragment::Color color;
|
||||
u32 col32 = ((u32*)textures.currentData)[(iv<<wshift)+iu];
|
||||
//todo - teach texcache how to provide these already in 5555
|
||||
col32 >>= 3;
|
||||
col32 &= 0x1F1F1F1F;
|
||||
color.color = col32;
|
||||
|
||||
color.color = ((u32*)textures.currentData)[(iv<<wshift)+iu];
|
||||
return color;
|
||||
}
|
||||
|
||||
|
@ -940,18 +935,24 @@ static void SoftRastVramReconfigureSignal() {
|
|||
TexCache_Invalidate();
|
||||
}
|
||||
|
||||
CACHE_ALIGN static const u16 alpha_lookup[] = {
|
||||
0x0000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
|
||||
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
|
||||
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
|
||||
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000};
|
||||
|
||||
static void SoftRastGetLine(int line, u16* dst, u8* dstAlpha)
|
||||
{
|
||||
Fragment* src = screen+((line)<<8);
|
||||
for(int i=0;i<256;i++)
|
||||
{
|
||||
const bool testRenderAlpha = false;
|
||||
u8 r = src->color.components.r;
|
||||
u8 g = src->color.components.g;
|
||||
u8 b = src->color.components.b;
|
||||
const u8 r = src->color.components.r;
|
||||
const u8 g = src->color.components.g;
|
||||
const u8 b = src->color.components.b;
|
||||
*dst = R5G5B5TORGB15(r,g,b);
|
||||
if(src->color.components.a > 0)
|
||||
*dst |= 0x8000;
|
||||
|
||||
*dst |= alpha_lookup[src->color.components.a];
|
||||
*dstAlpha = alpha_5bit_to_4bit[src->color.components.a];
|
||||
|
||||
if(testRenderAlpha)
|
||||
|
@ -971,12 +972,11 @@ static void SoftRastGetLineCaptured(int line, u16* dst) {
|
|||
Fragment* src = screen+((line)<<8);
|
||||
for(int i=0;i<256;i++)
|
||||
{
|
||||
u8 r = src->color.components.r;
|
||||
u8 g = src->color.components.g;
|
||||
u8 b = src->color.components.b;
|
||||
const u8 r = src->color.components.r;
|
||||
const u8 g = src->color.components.g;
|
||||
const u8 b = src->color.components.b;
|
||||
*dst = R5G5B5TORGB15(r,g,b);
|
||||
if(src->color.components.a > 0)
|
||||
*dst |= 0x8000;
|
||||
*dst |= alpha_lookup[src->color.components.a];
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
|
@ -1269,7 +1269,7 @@ static void SoftRastRender()
|
|||
|
||||
if(needInitTexture || lastTextureFormat != poly->texParam || lastTexturePalette != poly->texPalette)
|
||||
{
|
||||
TexCache_SetTexture(poly->texParam,poly->texPalette);
|
||||
TexCache_SetTexture<TexFormat_15bpp>(poly->texParam,poly->texPalette);
|
||||
sampler.setup(poly->texParam);
|
||||
lastTextureFormat = poly->texParam;
|
||||
lastTexturePalette = poly->texPalette;
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
using std::min;
|
||||
using std::max;
|
||||
|
||||
//only dump this from ogl renderer. for now, softrasterizer creates things in an incompatible pixel format
|
||||
//#define DEBUG_DUMP_TEXTURE
|
||||
|
||||
//This class represents a number of regions of memory which should be viewed as contiguous
|
||||
|
@ -150,7 +151,11 @@ static void DebugDumpTexture(int which)
|
|||
|
||||
|
||||
static int lastTexture = -1;
|
||||
void TexCache_SetTexture(unsigned int format, unsigned int texpal)
|
||||
|
||||
#define CONVERT(color,alpha) ((TEXFORMAT == TexFormat_32bpp)?(RGB15TO32(color,alpha)):RGB15TO5555(color,alpha))
|
||||
|
||||
template<TexCache_TexFormat TEXFORMAT>
|
||||
void TexCache_SetTexture(u32 format, u32 texpal)
|
||||
{
|
||||
//for each texformat, number of palette entries
|
||||
const int palSizes[] = {0, 32, 4, 16, 256, 0, 8, 0};
|
||||
|
@ -309,7 +314,8 @@ REJECT:
|
|||
//INFO("Texture %03i - format=%08X; pal=%04X (mode %X, width %04i, height %04i)\n",i, texcache[i].frm, texcache[i].pal, texcache[i].mode, sizeX, sizeY);
|
||||
|
||||
//============================================================================ Texture conversion
|
||||
u32 palZeroTransparent = (1-((format>>29)&1))*255; // shash: CONVERT THIS TO A TABLE :)
|
||||
const u32 opaqueColor = TEXFORMAT==TexFormat_32bpp?255:31;
|
||||
u32 palZeroTransparent = (1-((format>>29)&1))*opaqueColor;
|
||||
|
||||
switch (texcache[tx].mode)
|
||||
{
|
||||
|
@ -321,6 +327,9 @@ REJECT:
|
|||
{
|
||||
u16 c = pal[*adr&31];
|
||||
u8 alpha = *adr>>5;
|
||||
if(TEXFORMAT == TexFormat_15bpp)
|
||||
*dwdst++ = RGB15TO5555(c,material_3bit_to_5bit[alpha]);
|
||||
else
|
||||
*dwdst++ = RGB15TO32(c,material_3bit_to_8bit[alpha]);
|
||||
adr++;
|
||||
}
|
||||
|
@ -339,19 +348,19 @@ REJECT:
|
|||
|
||||
bits = (*adr)&0x3;
|
||||
c = pal[bits];
|
||||
*dwdst++ = RGB15TO32(c,(bits == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);
|
||||
|
||||
bits = ((*adr)>>2)&0x3;
|
||||
c = pal[bits];
|
||||
*dwdst++ = RGB15TO32(c,(bits == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);
|
||||
|
||||
bits = ((*adr)>>4)&0x3;
|
||||
c = pal[bits];
|
||||
*dwdst++ = RGB15TO32(c,(bits == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);
|
||||
|
||||
bits = ((*adr)>>6)&0x3;
|
||||
c = pal[bits];
|
||||
*dwdst++ = RGB15TO32(c,(bits == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);
|
||||
|
||||
adr++;
|
||||
}
|
||||
|
@ -369,11 +378,11 @@ REJECT:
|
|||
|
||||
bits = (*adr)&0xF;
|
||||
c = pal[bits];
|
||||
*dwdst++ = RGB15TO32(c,(bits == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);
|
||||
|
||||
bits = ((*adr)>>4);
|
||||
c = pal[bits];
|
||||
*dwdst++ = RGB15TO32(c,(bits == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(bits == 0) ? palZeroTransparent : opaqueColor);
|
||||
adr++;
|
||||
}
|
||||
}
|
||||
|
@ -386,7 +395,7 @@ REJECT:
|
|||
for(u32 x = 0; x < ms.items[j].len; ++x)
|
||||
{
|
||||
u16 c = pal[*adr];
|
||||
*dwdst++ = RGB15TO32(c,(*adr == 0) ? palZeroTransparent : 255);
|
||||
*dwdst++ = CONVERT(c,(*adr == 0) ? palZeroTransparent : opaqueColor);
|
||||
adr++;
|
||||
}
|
||||
}
|
||||
|
@ -492,6 +501,17 @@ REJECT:
|
|||
}
|
||||
}
|
||||
|
||||
if(TEXFORMAT==TexFormat_15bpp)
|
||||
{
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
tmp_col[i] >>= 3;
|
||||
tmp_col[i] &= 0x1F1F1F1F;
|
||||
}
|
||||
}
|
||||
|
||||
//TODO - this could be more precise for 32bpp mode (run it through the color separation table)
|
||||
|
||||
//set all 16 texels
|
||||
for (int sy = 0; sy < 4; sy++)
|
||||
{
|
||||
|
@ -520,6 +540,9 @@ REJECT:
|
|||
{
|
||||
u16 c = pal[*adr&0x07];
|
||||
u8 alpha = (*adr>>3);
|
||||
if(TEXFORMAT == TexFormat_15bpp)
|
||||
*dwdst++ = RGB15TO5555(c,alpha);
|
||||
else
|
||||
*dwdst++ = RGB15TO32(c,material_5bit_to_8bit[alpha]);
|
||||
adr++;
|
||||
}
|
||||
|
@ -534,7 +557,7 @@ REJECT:
|
|||
{
|
||||
u16 c = map[x];
|
||||
int alpha = ((c&0x8000)?255:0);
|
||||
*dwdst++ = RGB15TO32(c&0x7FFF,alpha);
|
||||
*dwdst++ = CONVERT(c&0x7FFF,alpha);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -585,3 +608,7 @@ void TexCache_Invalidate()
|
|||
|
||||
void (*TexCache_BindTexture)(u32 texnum) = NULL;
|
||||
void (*TexCache_BindTextureData)(u32 texnum, u8* data);
|
||||
|
||||
//these templates needed to be instantiated manually
|
||||
template void TexCache_SetTexture<TexFormat_32bpp>(u32 format, u32 texpal);
|
||||
template void TexCache_SetTexture<TexFormat_15bpp>(u32 format, u32 texpal);
|
|
@ -3,6 +3,12 @@
|
|||
|
||||
#include "common.h"
|
||||
|
||||
enum TexCache_TexFormat
|
||||
{
|
||||
TexFormat_32bpp,
|
||||
TexFormat_15bpp
|
||||
};
|
||||
|
||||
#define MAX_TEXTURE 500
|
||||
#ifndef NOSSE2
|
||||
struct ALIGN(16) TextureCache
|
||||
|
@ -36,7 +42,10 @@ extern void (*TexCache_BindTexture)(u32 texnum);
|
|||
extern void (*TexCache_BindTextureData)(u32 texnum, u8* data);
|
||||
|
||||
void TexCache_Reset();
|
||||
void TexCache_SetTexture(unsigned int format, unsigned int texpal);
|
||||
|
||||
template<TexCache_TexFormat format>
|
||||
void TexCache_SetTexture(u32 format, u32 texpal);
|
||||
|
||||
void TexCache_Invalidate();
|
||||
|
||||
extern u8 TexCache_texMAP[1024*2048*4];
|
||||
|
|
Loading…
Reference in New Issue