📄 s_depth.c
字号:
for (i=0;i<n;i++) { if (mask[i]) { zbuffer[i] = z[i]; passed++; } } } else { /* Don't update Z buffer or mask */ passed = n; } break; case GL_NEVER: _mesa_bzero(mask, n * sizeof(GLubyte)); break; default: _mesa_problem(ctx, "Bad depth func in depth_test_span32"); } return passed;}/* * Apply depth test to span of fragments. */static GLuintdepth_test_span( GLcontext *ctx, SWspan *span){ struct gl_framebuffer *fb = ctx->DrawBuffer; struct gl_renderbuffer *rb = fb->_DepthBuffer; const GLint x = span->x; const GLint y = span->y; const GLuint count = span->end; const GLuint *zValues = span->array->z; GLubyte *mask = span->array->mask; GLuint passed; ASSERT((span->arrayMask & SPAN_XY) == 0); ASSERT(span->arrayMask & SPAN_Z); if (rb->GetPointer(ctx, rb, 0, 0)) { /* Directly access buffer */ if (rb->DataType == GL_UNSIGNED_SHORT) { GLushort *zbuffer = (GLushort *) rb->GetPointer(ctx, rb, x, y); passed = depth_test_span16(ctx, count, zbuffer, zValues, mask); } else { GLuint *zbuffer = (GLuint *) rb->GetPointer(ctx, rb, x, y); ASSERT(rb->DataType == GL_UNSIGNED_INT); passed = depth_test_span32(ctx, count, zbuffer, zValues, mask); } } else { /* read depth values from buffer, test, write back */ if (rb->DataType == GL_UNSIGNED_SHORT) { GLushort zbuffer[MAX_WIDTH]; rb->GetRow(ctx, rb, count, x, y, zbuffer); passed = depth_test_span16(ctx, count, zbuffer, zValues, mask ); rb->PutRow(ctx, rb, count, x, y, zbuffer, NULL); } else { GLuint zbuffer[MAX_WIDTH]; ASSERT(rb->DataType == GL_UNSIGNED_INT); rb->GetRow(ctx, rb, count, x, y, zbuffer); passed = depth_test_span32(ctx, count, zbuffer, zValues, mask ); rb->PutRow(ctx, rb, count, x, y, zbuffer, NULL); } } if (passed < count) { span->writeAll = GL_FALSE; } return passed;}#define Z_ADDRESS(X, Y) (zStart + (Y) * stride + (X))/* * Do depth testing for an array of fragments at assorted locations. */static voiddirect_depth_test_pixels16(GLcontext *ctx, GLushort *zStart, GLuint stride, GLuint n, const GLint x[], const GLint y[], const GLuint z[], GLubyte mask[] ){ /* switch cases ordered from most frequent to less frequent */ switch (ctx->Depth.Func) { case GL_LESS: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] < *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] < *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_LEQUAL: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] <= *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] <= *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_GEQUAL: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] >= *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] >= *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_GREATER: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] > *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] > *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_NOTEQUAL: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] != *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] != *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_EQUAL: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] == *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] == *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_ALWAYS: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLushort *zptr = Z_ADDRESS(x[i], y[i]); *zptr = z[i]; } } } else { /* Don't update Z buffer or mask */ } break; case GL_NEVER: /* depth test never passes */ _mesa_bzero(mask, n * sizeof(GLubyte)); break; default: _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels"); }}/* * Do depth testing for an array of fragments with direct access to zbuffer. */static voiddirect_depth_test_pixels32(GLcontext *ctx, GLuint *zStart, GLuint stride, GLuint n, const GLint x[], const GLint y[], const GLuint z[], GLubyte mask[] ){ /* switch cases ordered from most frequent to less frequent */ switch (ctx->Depth.Func) { case GL_LESS: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] < *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] < *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_LEQUAL: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] <= *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] <= *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_GEQUAL: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] >= *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] >= *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } } break; case GL_GREATER: if (ctx->Depth.Mask) { /* Update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] > *zptr) { /* pass */ *zptr = z[i]; } else { /* fail */ mask[i] = 0; } } } } else { /* Don't update Z buffer */ GLuint i; for (i=0; i<n; i++) { if (mask[i]) { GLuint *zptr = Z_ADDRESS(x[i], y[i]); if (z[i] > *zptr) { /* pass */ } else { /* fail */ mask[i] = 0; } } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -