@ -38,9 +38,103 @@ int tex;
@@ -38,9 +38,103 @@ int tex;
unsigned short * buffer ;
# define LOAD(x) p##x = gEngfuncs.GL_GetProcAddress(#x)
void R_InitBlit ( )
void R_BuildScreenMap ( )
{
int i ;
# ifdef SEPARATE_BLIT
for ( i = 0 ; i < 256 ; i + + )
{
unsigned int r , g , b ;
// 332 to 565
r = ( ( i > > ( 8 - 3 ) ) < < 2 ) & MASK ( 5 ) ;
g = ( ( i > > ( 8 - 3 - 3 ) ) < < 3 ) & MASK ( 6 ) ;
b = ( ( i > > ( 8 - 3 - 3 - 2 ) ) < < 3 ) & MASK ( 5 ) ;
vid . screen_major [ i ] = r < < ( 6 + 5 ) | ( g < < 5 ) | b ;
// restore minor GBRGBRGB
r = MOVE_BIT ( i , 5 , 1 ) | MOVE_BIT ( i , 2 , 0 ) ;
g = MOVE_BIT ( i , 7 , 2 ) | MOVE_BIT ( i , 4 , 1 ) | MOVE_BIT ( i , 1 , 0 ) ;
b = MOVE_BIT ( i , 6 , 2 ) | MOVE_BIT ( i , 3 , 1 ) | MOVE_BIT ( i , 0 , 0 ) ;
vid . screen_minor [ i ] = r < < ( 6 + 5 ) | ( g < < 5 ) | b ;
}
# else
for ( i = 0 ; i < 256 ; i + + )
{
unsigned int r , g , b , major , j ;
// 332 to 565
r = ( ( i > > ( 8 - 3 ) ) < < 2 ) & MASK ( 5 ) ;
g = ( ( i > > ( 8 - 3 - 3 ) ) < < 3 ) & MASK ( 6 ) ;
b = ( ( i > > ( 8 - 3 - 3 - 2 ) ) < < 3 ) & MASK ( 5 ) ;
major = r < < ( 6 + 5 ) | ( g < < 5 ) | b ;
for ( j = 0 ; j < 256 ; j + + )
{
// restore minor GBRGBRGB
r = MOVE_BIT ( i , 5 , 1 ) | MOVE_BIT ( i , 2 , 0 ) ;
g = MOVE_BIT ( i , 7 , 2 ) | MOVE_BIT ( i , 4 , 1 ) | MOVE_BIT ( i , 1 , 0 ) ;
b = MOVE_BIT ( i , 6 , 2 ) | MOVE_BIT ( i , 3 , 1 ) | MOVE_BIT ( i , 0 , 0 ) ;
vid . screen [ ( i < < 8 ) | j ] = r < < ( 6 + 5 ) | ( g < < 5 ) | b | major ;
}
}
# endif
}
void R_BuildBlendMaps ( )
{
unsigned int r1 , g1 , b1 ;
unsigned int r2 , g2 , b2 ;
for ( r1 = 0 ; r1 < BIT ( 3 ) ; r1 + + )
for ( g1 = 0 ; g1 < BIT ( 3 ) ; g1 + + )
for ( b1 = 0 ; b1 < BIT ( 2 ) ; b1 + + )
for ( r2 = 0 ; r2 < BIT ( 3 ) ; r2 + + )
for ( g2 = 0 ; g2 < BIT ( 3 ) ; g2 + + )
for ( b2 = 0 ; b2 < BIT ( 2 ) ; b2 + + )
{
unsigned int r , g , b ;
unsigned short index1 = r1 < < ( 2 + 3 ) | g1 < < 2 | b1 ;
unsigned short index2 = ( r2 < < ( 2 + 3 ) | g2 < < 2 | b2 ) < < 8 ;
unsigned int a ;
r = r1 + r2 ;
g = g1 + g2 ;
b = b1 + b2 ;
if ( r > MASK ( 2 ) )
r = MASK ( 2 ) ;
if ( g > MASK ( 2 ) )
g = MASK ( 2 ) ;
if ( b > MASK ( 1 ) )
b = MASK ( 1 ) ;
ASSERT ( ! vid . addmap [ index2 | index1 ] ) ;
vid . addmap [ index2 | index1 ] = r < < ( 2 + 3 ) | g < < 2 | b ;
r = r1 * r2 / MASK ( 2 ) ;
g = g1 * g2 / MASK ( 2 ) ;
b = b1 * b2 / MASK ( 1 ) ;
vid . modmap [ index2 | index1 ] = r < < ( 2 + 3 ) | g < < 2 | b ;
for ( a = 0 ; a < 8 ; a + + )
{
r = r1 * a / 7 + r2 * ( 7 - a ) / 7 ;
g = g1 * a / 7 + g2 * ( 7 - a ) / 7 ;
b = b1 * a / 7 + b2 * ( 7 - a ) / 7 ;
vid . alphamap [ a < < 16 | index2 | index1 ] = r < < ( 2 + 3 ) | g < < 2 | b ;
}
}
}
void R_InitBlit ( )
{
LOAD ( glBegin ) ;
LOAD ( glEnd ) ;
LOAD ( glTexCoord2f ) ;
@ -58,7 +152,7 @@ void R_InitBlit()
@@ -58,7 +152,7 @@ void R_InitBlit()
LOAD ( glGetError ) ;
LOAD ( glGenTextures ) ;
LOAD ( glTexParameteri ) ;
# ifdef GLDEBUG
if ( gpGlobals - > developer )
{
gEngfuncs . Con_Reportf ( " Installing GL_DebugOutput... \n " ) ;
@ -70,25 +164,14 @@ void R_InitBlit()
@@ -70,25 +164,14 @@ void R_InitBlit()
// enable all the low priority messages
pglDebugMessageControlARB ( GL_DONT_CARE , GL_DONT_CARE , GL_DEBUG_SEVERITY_LOW_ARB , 0 , NULL , true ) ;
# endif
pglGenTextures ( 1 , & tex ) ;
buffer = Mem_Malloc ( r_temppool , 1920 * 1080 * 2 ) ;
for ( i = 0 ; i < 256 ; i + + )
{
unsigned int r , g , b ;
// 332 to 565
r = ( ( i > > ( 8 - 3 ) ) < < 2 ) & MASK ( 5 ) ;
g = ( ( i > > ( 8 - 3 - 3 ) ) < < 3 ) & MASK ( 6 ) ;
b = ( ( i > > ( 8 - 3 - 3 - 2 ) ) < < 3 ) & MASK ( 5 ) ;
vid . screen_major [ i ] = r < < ( 6 + 5 ) | ( g < < 5 ) | b ;
buffer = Mem_Malloc ( r_temppool , 1920 * 1080 * 2 ) ;
// restore minor GBRGBRGB
r = MOVE_BIT ( i , 5 , 1 ) | MOVE_BIT ( i , 2 , 0 ) ;
g = MOVE_BIT ( i , 7 , 2 ) | MOVE_BIT ( i , 4 , 1 ) | MOVE_BIT ( i , 1 , 0 ) ;
b = MOVE_BIT ( i , 6 , 2 ) | MOVE_BIT ( i , 3 , 1 ) | MOVE_BIT ( i , 0 , 0 ) ;
vid . screen_minor [ i ] = r < < ( 6 + 5 ) | ( g < < 5 ) | b ;
}
R_BuildScreenMap ( ) ;
R_BuildBlendMaps ( ) ;
}
void R_BlitScreen ( )
@ -99,11 +182,18 @@ void R_BlitScreen()
@@ -99,11 +182,18 @@ void R_BlitScreen()
for ( i = 0 ; i < vid . width * vid . height ; i + + )
{
# ifdef SEPARATE_BLIT
// need only 1024 bytes table, but slower
// wtf?? maybe some prefetch???
byte major = buf [ ( i < < 1 ) + 1 ] ;
byte minor = buf [ ( i < < 1 ) ] ;
buffer [ i ] = vid . screen_major [ major ] | vid . screen_minor [ minor ] ;
# else
buffer [ i ] = vid . screen [ vid . buffer [ i ] ] ;
# endif
}
pglBindTexture ( GL_TEXTURE_2D , tex ) ;
pglViewport ( 0 , 0 , gpGlobals - > width , gpGlobals - > height ) ;
pglMatrixMode ( GL_PROJECTION ) ;
@ -119,6 +209,7 @@ void R_BlitScreen()
@@ -119,6 +209,7 @@ void R_BlitScreen()
pglTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_CLAMP_TO_EDGE ) ;
pglTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE ) ;
//gEngfuncs.Con_Printf("%d\n",pglGetError());
pglTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGB , vid . width , vid . height , 0 , GL_RGB , GL_UNSIGNED_SHORT_5_6_5 , buffer ) ;
//gEngfuncs.Con_Printf("%d\n",pglGetError());
pglBegin ( GL_QUADS ) ;
@ -136,4 +227,5 @@ void R_BlitScreen()
@@ -136,4 +227,5 @@ void R_BlitScreen()
pglEnd ( ) ;
pglDisable ( GL_TEXTURE_2D ) ;
gEngfuncs . GL_SwapBuffers ( ) ;
memset ( vid . buffer , 0 , vid . width * vid . height * 2 ) ;
}