mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02:00
Check for overflow when converting floating pt Z values to 32-bit GLuint.
This commit is contained in:
parent
efbf170cfb
commit
0c7cbf0a7c
1 changed files with 39 additions and 8 deletions
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
* Mesa 3-D graphics library
|
* Mesa 3-D graphics library
|
||||||
* Version: 6.5
|
* Version: 6.5.1
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
|
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
* copy of this software and associated documentation files (the "Software"),
|
||||||
|
|
@ -478,6 +478,41 @@ copy_ci_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert floating point Z values to integer Z values with pixel transfer's
|
||||||
|
* Z scale and bias.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
scale_and_bias_z(GLcontext *ctx, GLuint width,
|
||||||
|
const GLfloat depth[], GLuint z[])
|
||||||
|
{
|
||||||
|
const GLuint depthMax = ctx->DrawBuffer->_DepthMax;
|
||||||
|
GLuint i;
|
||||||
|
|
||||||
|
if (depthMax <= 0xffffff &&
|
||||||
|
ctx->Pixel.DepthScale == 1.0 &&
|
||||||
|
ctx->Pixel.DepthBias == 0.0) {
|
||||||
|
/* no scale or bias and no clamping and no worry of overflow */
|
||||||
|
const GLfloat depthMaxF = ctx->DrawBuffer->_DepthMaxF;
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
z[i] = (GLuint) (depth[i] * depthMaxF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* need to be careful with overflow */
|
||||||
|
const GLdouble depthMaxF = ctx->DrawBuffer->_DepthMaxF;
|
||||||
|
for (i = 0; i < width; i++) {
|
||||||
|
GLdouble d = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
|
||||||
|
d = CLAMP(d, 0.0, 1.0) * depthMaxF;
|
||||||
|
if (d >= depthMaxF)
|
||||||
|
z[i] = depthMax;
|
||||||
|
else
|
||||||
|
z[i] = (GLuint) d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: Optimize!!!!
|
* TODO: Optimize!!!!
|
||||||
|
|
@ -490,10 +525,9 @@ copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
|
||||||
SWcontext *swrast = SWRAST_CONTEXT(ctx);
|
SWcontext *swrast = SWRAST_CONTEXT(ctx);
|
||||||
struct gl_framebuffer *fb = ctx->ReadBuffer;
|
struct gl_framebuffer *fb = ctx->ReadBuffer;
|
||||||
struct gl_renderbuffer *readRb = fb->_DepthBuffer;
|
struct gl_renderbuffer *readRb = fb->_DepthBuffer;
|
||||||
const GLfloat depthMax = fb->_DepthMaxF;
|
|
||||||
GLfloat *p, *tmpImage;
|
GLfloat *p, *tmpImage;
|
||||||
GLint sy, dy, stepy;
|
GLint sy, dy, stepy;
|
||||||
GLint i, j;
|
GLint j;
|
||||||
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
|
const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
|
||||||
GLint overlapping;
|
GLint overlapping;
|
||||||
struct sw_span span;
|
struct sw_span span;
|
||||||
|
|
@ -562,10 +596,7 @@ copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* apply scale and bias */
|
/* apply scale and bias */
|
||||||
for (i = 0; i < width; i++) {
|
scale_and_bias_z(ctx, width, depth, span.array->z);
|
||||||
GLfloat d = depth[i] * ctx->Pixel.DepthScale + ctx->Pixel.DepthBias;
|
|
||||||
span.array->z[i] = (GLuint) (CLAMP(d, 0.0F, 1.0F) * depthMax);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* write depth values */
|
/* write depth values */
|
||||||
span.x = destx;
|
span.x = destx;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue