ref: soft: fix R_DrawStretchPic and Draw_Fill with OpenMP enabled

This commit is contained in:
Alibek Omarov 2024-06-11 02:03:39 +03:00
parent 9577a6af21
commit d57d8e0d5d
2 changed files with 54 additions and 105 deletions

View file

@ -320,7 +320,7 @@ static void GAME_EXPORT R_SetupSky( int *skyboxTextures )
return; return;
for( i = 0; i < SKYBOX_MAX_SIDES; i++ ) for( i = 0; i < SKYBOX_MAX_SIDES; i++ )
tr.skyboxTextures[i] = skyboxTextures; tr.skyboxTextures[i] = skyboxTextures[i];
} }
qboolean GAME_EXPORT VID_CubemapShot(const char *base, uint size, const float *vieworg, qboolean skyshot) qboolean GAME_EXPORT VID_CubemapShot(const char *base, uint size, const float *vieworg, qboolean skyshot)

View file

@ -65,10 +65,7 @@ Draw_StretchPicImplementation
*/ */
static void R_DrawStretchPicImplementation( int x, int y, int w, int h, int s1, int t1, int s2, int t2, image_t *pic ) static void R_DrawStretchPicImplementation( int x, int y, int w, int h, int s1, int t1, int s2, int t2, image_t *pic )
{ {
pixel_t *source, *dest;
unsigned int u, sv;
unsigned int height; unsigned int height;
unsigned int f, fstep;
int skip, v; int skip, v;
qboolean transparent = false; qboolean transparent = false;
pixel_t *buffer; pixel_t *buffer;
@ -108,8 +105,6 @@ static void R_DrawStretchPicImplementation( int x, int y, int w, int h, int s1,
else else
skip = 0; skip = 0;
dest = vid.buffer + y * vid.rowbytes + x;
if( pic->alpha_pixels ) if( pic->alpha_pixels )
{ {
buffer = pic->alpha_pixels; buffer = pic->alpha_pixels;
@ -119,73 +114,55 @@ static void R_DrawStretchPicImplementation( int x, int y, int w, int h, int s1,
buffer = pic->pixels[0]; buffer = pic->pixels[0];
#pragma omp parallel for schedule(static) #pragma omp parallel for schedule(static)
for (v=0 ; v<height ; v++) for (v=0 ; v<height ; v++)
{ {
int alpha1 = vid.alpha; int alpha1 = vid.alpha;
#ifdef _OPENMP
pixel_t *dest = vid.buffer + (y + v) * vid.rowbytes + x; pixel_t *dest = vid.buffer + (y + v) * vid.rowbytes + x;
#endif uint sv = (skip + v)*(t2-t1)/h + t1;
sv = (skip + v)*(t2-t1)/h + t1; uint u, f, fstep;
source = buffer + sv*pic->width + s1; pixel_t *source = buffer + sv*pic->width + s1;
f = 0;
fstep = ((s2-s1) << 16)/w;
for (u=0 ; u<w ; u++)
{ {
f = 0; pixel_t src = source[f>>16];
fstep = ((s2-s1) << 16)/w; int alpha = alpha1;
f += fstep;
#if 0 if( transparent )
for (u=0 ; u<w ; u+=4)
{ {
dest[u] = source[f>>16]; alpha &= src >> ( 16 - 3 );
f += fstep; src = src << 3;
dest[u+1] = source[f>>16];
f += fstep;
dest[u+2] = source[f>>16];
f += fstep;
dest[u+3] = source[f>>16];
f += fstep;
} }
#else
for (u=0 ; u<w ; u++) if( alpha == 0 )
continue;
if( vid.color != COLOR_WHITE )
src = vid.modmap[(src & 0xff00)|(vid.color>>8)] << 8 | (src & vid.color & 0xff) | ((src & 0xff) >> 3);
if( vid.rendermode == kRenderTransAdd)
{ {
pixel_t src = source[f>>16]; pixel_t screen = dest[u];
int alpha = alpha1; dest[u] = vid.addmap[(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) | ((src & 0xff) >> 0);
f += fstep;
if( transparent )
{
alpha &= src >> ( 16 - 3 );
src = src << 3;
}
if( alpha == 0 )
continue;
if( vid.color != COLOR_WHITE )
src = vid.modmap[(src & 0xff00)|(vid.color>>8)] << 8 | (src & vid.color & 0xff) | ((src & 0xff) >> 3);
if( vid.rendermode == kRenderTransAdd)
{
pixel_t screen = dest[u];
dest[u] = vid.addmap[(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) | ((src & 0xff) >> 0);
}
else if( vid.rendermode == kRenderScreenFadeModulate )
{
pixel_t screen = dest[u];
dest[u] = BLEND_COLOR( screen, vid.color );
}
else if( alpha < 7) // && (vid.rendermode == kRenderTransAlpha || vid.rendermode == kRenderTransTexture ) )
{
pixel_t screen = dest[u]; // | 0xff & screen & src ;
dest[u] = BLEND_ALPHA( alpha, src, screen );//vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) >> 3 | ((src & 0xff) >> 3);
}
else
dest[u] = src;
} }
#endif else if( vid.rendermode == kRenderScreenFadeModulate )
{
pixel_t screen = dest[u];
dest[u] = BLEND_COLOR( screen, vid.color );
}
else if( alpha < 7) // && (vid.rendermode == kRenderTransAlpha || vid.rendermode == kRenderTransTexture ) )
{
pixel_t screen = dest[u]; // | 0xff & screen & src ;
dest[u] = BLEND_ALPHA( alpha, src, screen );//vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) >> 3 | ((src & 0xff) >> 3);
}
else
dest[u] = src;
} }
dest += vid.rowbytes;
} }
} }
@ -211,10 +188,8 @@ void GAME_EXPORT R_DrawStretchPic( float x, float y, float w, float h, float s1,
void Draw_Fill (int x, int y, int w, int h) void Draw_Fill (int x, int y, int w, int h)
{ {
pixel_t *dest; unsigned int height;
unsigned int u; int v;
unsigned int height;
int skip, v;
pixel_t src = vid.color; pixel_t src = vid.color;
int alpha = vid.alpha; int alpha = vid.alpha;
@ -238,60 +213,34 @@ void Draw_Fill (int x, int y, int w, int h)
{ {
if( h <= -y ) if( h <= -y )
return; return;
skip = -y;
height += y; height += y;
y = 0; y = 0;
} }
else
skip = 0;
dest = vid.buffer + y * vid.rowbytes + x; #pragma omp parallel for schedule(static)
#pragma omp parallel for schedule(static)
for (v=0 ; v<height ; v++) for (v=0 ; v<height ; v++)
{ {
#ifdef _OPENMP pixel_t *dest = vid.buffer + (y + v) * vid.rowbytes + x;
pixel_t *dest = vid.buffer + (y + v) * vid.rowbytes + x; uint u;
#endif
for (u=0 ; u<w ; u++)
{ {
if( alpha == 0 )
continue;
#if 0 if( vid.rendermode == kRenderTransAdd)
for (u=0 ; u<w ; u+=4)
{ {
dest[u] = source[f>>16]; pixel_t screen = dest[u];
f += fstep; dest[u] = vid.addmap[(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) | ((src & 0xff) >> 0);
dest[u+1] = source[f>>16];
f += fstep;
dest[u+2] = source[f>>16];
f += fstep;
dest[u+3] = source[f>>16];
f += fstep;
} }
#else else if( alpha < 7) // && (vid.rendermode == kRenderTransAlpha || vid.rendermode == kRenderTransTexture ) )
for (u=0 ; u<w ; u++)
{ {
if( alpha == 0 ) pixel_t screen = dest[u]; // | 0xff & screen & src ;
continue; dest[u] = BLEND_ALPHA( alpha, src, screen);//vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) >> 3 | ((src & 0xff) >> 3);
if( vid.rendermode == kRenderTransAdd)
{
pixel_t screen = dest[u];
dest[u] = vid.addmap[(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) | ((src & 0xff) >> 0);
}
else if( alpha < 7) // && (vid.rendermode == kRenderTransAlpha || vid.rendermode == kRenderTransTexture ) )
{
pixel_t screen = dest[u]; // | 0xff & screen & src ;
dest[u] = BLEND_ALPHA( alpha, src, screen);//vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) >> 3 | ((src & 0xff) >> 3);
}
else
dest[u] = src;
} }
#endif else
dest[u] = src;
} }
dest += vid.rowbytes;
} }
} }