Browse Source

fix glDrawPixels hang when clipping

tags/vtx-0-2-21112003-freeze
Brian Paul 23 years ago
parent
commit
ed96f46637
1 changed files with 30 additions and 15 deletions
  1. 30
    15
      src/mesa/swrast/s_drawpix.c

+ 30
- 15
src/mesa/swrast/s_drawpix.c View File

@@ -1,10 +1,10 @@
/* $Id: s_drawpix.c,v 1.42 2002/12/18 15:02:19 brianp Exp $ */
/* $Id: s_drawpix.c,v 1.43 2003/01/15 23:46:34 brianp Exp $ */

/*
* Mesa 3-D graphics library
* Version: 5.1
*
* Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
* Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -578,10 +578,10 @@ draw_stencil_pixels( GLcontext *ctx, GLint x, GLint y,
/* if width > MAX_WIDTH, have to process image in chunks */
skipPixels = 0;
while (skipPixels < width) {
GLint spanX = x;
const GLint spanX = x;
GLint spanY = y;
GLint spanWidth = (width - skipPixels > MAX_WIDTH)
? MAX_WIDTH : (width - skipPixels);
const GLint spanWidth = (width - skipPixels > MAX_WIDTH)
? MAX_WIDTH : (width - skipPixels);

for (row = 0; row < height; row++, spanY++) {
GLstencil values[MAX_WIDTH];
@@ -688,17 +688,25 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,

/* in case width > MAX_WIDTH do the copy in chunks */
while (skipPixels < width) {
span.x = x + (zoom ? 0 : skipPixels);
span.y = y;
span.end = (width - skipPixels > MAX_WIDTH)
? MAX_WIDTH : (width - skipPixels);
const GLint spanX = x + (zoom ? 0 : skipPixels);
GLint spanY = y;
const GLint spanEnd = (width - skipPixels > MAX_WIDTH)
? MAX_WIDTH : (width - skipPixels);
ASSERT(span.end <= MAX_WIDTH);
for (row = 0; row < height; row++, span.y++) {
for (row = 0; row < height; row++, spanY++) {
GLfloat floatSpan[MAX_WIDTH];
const GLvoid *src = _mesa_image_address(&ctx->Unpack,
pixels, width, height,
GL_DEPTH_COMPONENT, type,
0, row, skipPixels);

/* Set these for each row since the _mesa_write_* function may
* change them while clipping.
*/
span.x = spanX;
span.y = spanY;
span.end = spanEnd;

_mesa_unpack_depth_span(ctx, span.end, floatSpan, type,
src, &ctx->Unpack);
/* clamp depth values to [0,1] and convert from floats to ints */
@@ -836,16 +844,23 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,

/* if the span is wider than MAX_WIDTH we have to do it in chunks */
while (skipPixels < width) {
span.x = x + (zoom ? 0 : skipPixels);
span.y = y;
span.end = (width - skipPixels > MAX_WIDTH)
? MAX_WIDTH : (width - skipPixels);
const GLint spanX = x + (zoom ? 0 : skipPixels);
GLint spanY = y;
const GLint spanEnd = (width - skipPixels > MAX_WIDTH)
? MAX_WIDTH : (width - skipPixels);
ASSERT(span.end <= MAX_WIDTH);

for (row = 0; row < height; row++, span.y++) {
for (row = 0; row < height; row++, spanY++) {
const GLvoid *source = _mesa_image_address(unpack,
pixels, width, height, format, type, 0, row, skipPixels);

/* Set these for each row since the _mesa_write_* function may
* change them while clipping.
*/
span.x = spanX;
span.y = spanY;
span.end = spanEnd;

_mesa_unpack_chan_color_span(ctx, span.end, GL_RGBA,
(GLchan *) span.array->rgba,
format, type, source, unpack,

Loading…
Cancel
Save