Beispiel #1
0
/**
 * Do software-based glCopyPixels.
 * By time we get here, all parameters will have been error-checked.
 */
void
_swrast_CopyPixels( struct gl_context *ctx,
                    GLint srcx, GLint srcy, GLsizei width, GLsizei height,
                    GLint destx, GLint desty, GLenum type )
{
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
    struct gl_renderbuffer *rb;

    if (!_mesa_check_conditional_render(ctx))
        return; /* don't copy */

    if (swrast->NewState)
        _swrast_validate_derived( ctx );

    if (!(SWRAST_CONTEXT(ctx)->_RasterMask != 0x0 ||
            ctx->Pixel.ZoomX != 1.0F ||
            ctx->Pixel.ZoomY != 1.0F ||
            ctx->_ImageTransferState) &&
            swrast_fast_copy_pixels(ctx, srcx, srcy, width, height, destx, desty,
                                    type)) {
        /* all done */
        return;
    }

    swrast_render_start(ctx);
    rb = map_readbuffer(ctx, type);

    switch (type) {
    case GL_COLOR:
        copy_rgba_pixels( ctx, srcx, srcy, width, height, destx, desty );
        break;
    case GL_DEPTH:
        copy_depth_pixels( ctx, srcx, srcy, width, height, destx, desty );
        break;
    case GL_STENCIL:
        copy_stencil_pixels( ctx, srcx, srcy, width, height, destx, desty );
        break;
    case GL_DEPTH_STENCIL_EXT:
        /* Copy buffers separately (if the fast copy path wasn't taken) */
        copy_depth_pixels(ctx, srcx, srcy, width, height, destx, desty);
        copy_stencil_pixels(ctx, srcx, srcy, width, height, destx, desty);
        break;
    default:
        _mesa_problem(ctx, "unexpected type in _swrast_CopyPixels");
    }

    swrast_render_finish(ctx);

    if (rb) {
        struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
        ctx->Driver.UnmapRenderbuffer(ctx, rb);
        srb->Map = NULL;
    }
}
Beispiel #2
0
/**
 * Software fallback for glBlitFramebufferEXT().
 */
void
_swrast_BlitFramebuffer(struct gl_context *ctx,
                        GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
                        GLbitfield mask, GLenum filter)
{
   static const GLbitfield buffers[3] = {
      GL_COLOR_BUFFER_BIT,
      GL_DEPTH_BUFFER_BIT,
      GL_STENCIL_BUFFER_BIT
   };
   static const GLenum buffer_enums[3] = {
      GL_COLOR,
      GL_DEPTH,
      GL_STENCIL,
   };
   GLint i;

   if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
                        &dstX0, &dstY0, &dstX1, &dstY1)) {
      return;
   }

   if (SWRAST_CONTEXT(ctx)->NewState)
      _swrast_validate_derived(ctx);

   /* First, try covering whatever buffers possible using the fast 1:1 copy
    * path.
    */
   if (srcX1 - srcX0 == dstX1 - dstX0 &&
       srcY1 - srcY0 == dstY1 - dstY0 &&
       srcX0 < srcX1 &&
       srcY0 < srcY1 &&
       dstX0 < dstX1 &&
       dstY0 < dstY1) {
      for (i = 0; i < 3; i++) {
         if (mask & buffers[i]) {
	    if (swrast_fast_copy_pixels(ctx,
					srcX0, srcY0,
					srcX1 - srcX0, srcY1 - srcY0,
					dstX0, dstY0,
					buffer_enums[i])) {
	       mask &= ~buffers[i];
	    }
	 }
      }

      if (!mask)
	 return;
   }

   if (filter == GL_NEAREST) {
      for (i = 0; i < 3; i++) {
	 if (mask & buffers[i]) {
	    blit_nearest(ctx,  srcX0, srcY0, srcX1, srcY1,
			 dstX0, dstY0, dstX1, dstY1, buffers[i]);
	 }
      }
   }
   else {
      ASSERT(filter == GL_LINEAR);
      if (mask & GL_COLOR_BUFFER_BIT) {  /* depth/stencil not allowed */
	 blit_linear(ctx,  srcX0, srcY0, srcX1, srcY1,
		     dstX0, dstY0, dstX1, dstY1);
      }
   }

}
Beispiel #3
0
/**
 * Software fallback for glBlitFramebufferEXT().
 */
void
_swrast_BlitFramebuffer(struct gl_context *ctx,
                        struct gl_framebuffer *readFb,
                        struct gl_framebuffer *drawFb,
                        GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
                        GLbitfield mask, GLenum filter)
{
   static const GLbitfield buffers[3] = {
      GL_COLOR_BUFFER_BIT,
      GL_DEPTH_BUFFER_BIT,
      GL_STENCIL_BUFFER_BIT
   };
   static const GLenum buffer_enums[3] = {
      GL_COLOR,
      GL_DEPTH,
      GL_STENCIL,
   };
   GLint i;

   /* Page 679 of OpenGL 4.4 spec says:
    *    "Added BlitFramebuffer to commands affected by conditional rendering in
    *     section 10.10 (Bug 9562)."
    */
   if (!_mesa_check_conditional_render(ctx))
      return; /* Do not blit */

   if (!_mesa_clip_blit(ctx, readFb, drawFb, &srcX0, &srcY0, &srcX1, &srcY1,
                        &dstX0, &dstY0, &dstX1, &dstY1)) {
      return;
   }

   if (SWRAST_CONTEXT(ctx)->NewState)
      _swrast_validate_derived(ctx);

   /* First, try covering whatever buffers possible using the fast 1:1 copy
    * path.
    */
   if (srcX1 - srcX0 == dstX1 - dstX0 &&
       srcY1 - srcY0 == dstY1 - dstY0 &&
       srcX0 < srcX1 &&
       srcY0 < srcY1 &&
       dstX0 < dstX1 &&
       dstY0 < dstY1) {
      for (i = 0; i < 3; i++) {
         if (mask & buffers[i]) {
            if (swrast_fast_copy_pixels(ctx,
                                        readFb, drawFb,
                                        srcX0, srcY0,
                                        srcX1 - srcX0, srcY1 - srcY0,
                                        dstX0, dstY0,
                                        buffer_enums[i])) {
               mask &= ~buffers[i];
            }
         }
      }

      if (!mask)
         return;
   }

   if (filter == GL_NEAREST) {
      for (i = 0; i < 3; i++) {
          if (mask & buffers[i]) {
             blit_nearest(ctx, readFb, drawFb, srcX0, srcY0, srcX1, srcY1,
                          dstX0, dstY0, dstX1, dstY1, buffers[i]);
          }
      }
   }
   else {
      assert(filter == GL_LINEAR);
      if (mask & GL_COLOR_BUFFER_BIT) {  /* depth/stencil not allowed */
         blit_linear(ctx, readFb, drawFb, srcX0, srcY0, srcX1, srcY1,
                     dstX0, dstY0, dstX1, dstY1);
      }
   }

}