d = depth;
size = 0;
mipmaps = 0;
- w = width;
- h = height;
- d = depth;
for (;;)
{
s = w * h * d * sides * 4;
DPSOFTRAST_Flush();
if (pixels)
{
- dst = texture->bytes + (blocky * texture->mipmap[0][2] + blockx) * 4;
+ dst = texture->bytes + texture->mipmap[0][1] +(-blocky * texture->mipmap[0][2] + blockx) * 4;
while (blockheight > 0)
{
+ dst -= texture->mipmap[0][2] * 4;
memcpy(dst, pixels, blockwidth * 4);
pixels += blockwidth * 4;
- dst += texture->mipmap[0][2] * 4;
blockheight--;
}
}
if (texture->binds)
DPSOFTRAST_Flush();
if (pixels)
- memcpy(texture->bytes, pixels, texture->mipmap[0][1]);
+ {
+ int i, stride = texture->mipmap[0][2]*4;
+ unsigned char *dst = texture->bytes + texture->mipmap[0][1];
+ for (i = texture->mipmap[0][3];i > 0;i--)
+ {
+ dst -= stride;
+ memcpy(dst, pixels, stride);
+ pixels += stride;
+ }
+ }
DPSOFTRAST_Texture_CalculateMipmaps(index);
}
int DPSOFTRAST_Texture_GetWidth(int index, int mip)
if (th > sh) th = sh;
if (tw < 1 || th < 1)
return;
- sy1 = sheight - 1 - sy1;
+ sy1 = sheight - sy1 - th;
+ ty1 = theight - ty1 - th;
for (y = 0;y < th;y++)
- memcpy(tpixels + ((ty1 + y) * twidth + tx1), spixels + ((sy1 - y) * swidth + sx1), tw*4);
+ memcpy(tpixels + ((ty1 + y) * twidth + tx1), spixels + ((sy1 + y) * swidth + sx1), tw*4);
if (texture->mipmaps > 1)
DPSOFTRAST_Texture_CalculateMipmaps(index);
}
command->texture = texture;
dpsoftrast.texbound[unitnum] = texture;
- ATOMIC_ADD(texture->binds, dpsoftrast.numthreads);
+ if (texture)
+ ATOMIC_ADD(texture->binds, dpsoftrast.numthreads);
}
void DPSOFTRAST_SetVertexPointer(const float *vertex3f, size_t stride)
int subx;
const unsigned int * RESTRICT ini = (const unsigned int *)in4ub;
unsigned char * RESTRICT pixelmask = span->pixelmask;
- unsigned char * RESTRICT pixel = (unsigned char *)dpsoftrast.fb_colorpixels[0];
unsigned int * RESTRICT pixeli = (unsigned int *)dpsoftrast.fb_colorpixels[0];
- if (!pixel)
+ if (!pixeli)
return;
- pixel += (span->y * dpsoftrast.fb_width + span->x) * 4;
pixeli += span->y * dpsoftrast.fb_width + span->x;
// handle alphatest now (this affects depth writes too)
if (thread->shader_permutation & SHADERPERMUTATION_ALPHAKILL)
const unsigned char * RESTRICT pixel[4];
int width = texture->mipmap[mip][2], height = texture->mipmap[mip][3];
int wrapmask[2] = { width-1, height-1 };
- pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0];
+ pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0] + texture->mipmap[mip][1] - 4*width;
if(texture->filter & DPSOFTRAST_TEXTURE_FILTER_LINEAR)
{
unsigned int tc[2] = { x * (width<<12) - 2048, y * (height<<12) - 2048};
tci1[0] &= wrapmask[0];
tci1[1] &= wrapmask[1];
}
- pixel[0] = pixelbase + 4 * (tci[1]*width+tci[0]);
- pixel[1] = pixelbase + 4 * (tci[1]*width+tci1[0]);
- pixel[2] = pixelbase + 4 * (tci1[1]*width+tci[0]);
- pixel[3] = pixelbase + 4 * (tci1[1]*width+tci1[0]);
+ pixel[0] = pixelbase + 4 * (tci[0] - tci[1]*width);
+ pixel[1] = pixelbase + 4 * (tci[0] - tci[1]*width);
+ pixel[2] = pixelbase + 4 * (tci[0] - tci1[1]*width);
+ pixel[3] = pixelbase + 4 * (tci[0] - tci1[1]*width);
c[0] = (pixel[0][0]*lerp[0]+pixel[1][0]*lerp[1]+pixel[2][0]*lerp[2]+pixel[3][0]*lerp[3])>>24;
c[1] = (pixel[0][1]*lerp[0]+pixel[1][1]*lerp[1]+pixel[2][1]*lerp[2]+pixel[3][1]*lerp[3])>>24;
c[2] = (pixel[0][2]*lerp[0]+pixel[1][2]*lerp[1]+pixel[2][2]*lerp[2]+pixel[3][2]*lerp[3])>>24;
tci[0] &= wrapmask[0];
tci[1] &= wrapmask[1];
}
- pixel[0] = pixelbase + 4 * (tci[1]*width+tci[0]);
+ pixel[0] = pixelbase + 4 * (tci[0] - tci[1]*width);
c[0] = pixel[0][0];
c[1] = pixel[0][1];
c[2] = pixel[0][2];
return;
}
mip = triangle->mip[texunitindex];
- pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0];
+ pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0] + texture->mipmap[mip][1] - 4*texture->mipmap[mip][2];
// if this mipmap of the texture is 1 pixel, just fill it with that color
if (texture->mipmap[mip][1] == 4)
{
flags = texture->flags;
tcscale[0] = texture->mipmap[mip][2];
tcscale[1] = texture->mipmap[mip][3];
- tciwidth = texture->mipmap[mip][2];
+ tciwidth = -texture->mipmap[mip][2];
tcimin[0] = 0;
tcimin[1] = 0;
tcimax[0] = texture->mipmap[mip][2]-1;
return;
}
mip = triangle->mip[texunitindex];
- pixelbase = (const unsigned char *)texture->bytes + texture->mipmap[mip][0];
+ pixelbase = (const unsigned char *)texture->bytes + texture->mipmap[mip][0] + texture->mipmap[mip][1] - 4*texture->mipmap[mip][2];
// if this mipmap of the texture is 1 pixel, just fill it with that color
if (texture->mipmap[mip][1] == 4)
{
if (filter)
endtc = _mm_sub_ps(endtc, _mm_set1_ps(0.5f));
endsubtc = _mm_cvtps_epi32(_mm_mul_ps(endtc, _mm_set1_ps(65536.0f)));
- tcoffset = _mm_add_epi32(_mm_slli_epi32(_mm_shuffle_epi32(tcsize, _MM_SHUFFLE(0, 0, 0, 0)), 18), _mm_set1_epi32(4));
+ tcoffset = _mm_add_epi32(_mm_slli_epi32(_mm_sub_epi32(_mm_setzero_si128(), _mm_shuffle_epi32(tcsize, _MM_SHUFFLE(0, 0, 0, 0))), 18), _mm_set1_epi32(4));
tcmax = _mm_packs_epi32(tcmask, tcmask);
for (x = startx;x < endx;)
{
}
else
DPSOFTRAST_Draw_Span_VaryingBGRA8(triangle, span, buffer_FragColorbgra8, 1, buffer_z);
+ if(thread->shader_permutation & SHADERPERMUTATION_ALPHAKILL)
+ {
+ int x;
+ for (x = span->startx;x < span->endx;x++)
+ buffer_FragColorbgra8[x*4+3] = buffer_FragColorbgra8[x*4+3] * thread->uniform4f[DPSOFTRAST_UNIFORM_Alpha*4+0];
+ }
DPSOFTRAST_Draw_Span_FinishBGRA8(thread, triangle, span, buffer_FragColorbgra8);
}
{
for (x = startx;x < endx;x++)
{
- z = buffer_z[x];
+ // z = buffer_z[x];
diffusetex[0] = buffer_texture_colorbgra8[x*4+0];
diffusetex[1] = buffer_texture_colorbgra8[x*4+1];
diffusetex[2] = buffer_texture_colorbgra8[x*4+2];
static void DPSOFTRAST_PixelShader_Water(DPSOFTRAST_State_Thread *thread, const DPSOFTRAST_State_Triangle * RESTRICT triangle, const DPSOFTRAST_State_Span * RESTRICT span)
{
float buffer_z[DPSOFTRAST_DRAW_MAXSPANLENGTH];
- float z;
+ // float z;
int x, startx = span->startx, endx = span->endx;
// texture reads
unsigned char c2[4];
float Fresnel;
- z = buffer_z[x];
+ // z = buffer_z[x];
// " vec4 ScreenScaleRefractReflectIW = ScreenScaleRefractReflect * (1.0 / ModelViewProjectionPosition.w);\n"
iw = 1.0f / (ModelViewProjectionPositiondata[3] + ModelViewProjectionPositionslope[3]*x); // / z
int depthslope;
unsigned int d;
unsigned char *pixelmask;
- DPSOFTRAST_State_Triangle *triangle;
- triangle = &thread->triangles[span->triangle];
depthpixel = dpsoftrast.fb_depthpixels + span->y * dpsoftrast.fb_width + span->x;
startx = span->startx;
endx = span->endx;