Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**********************************************************
  2.  * Copyright 2008-2009 VMware, Inc.  All rights reserved.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person
  5.  * obtaining a copy of this software and associated documentation
  6.  * files (the "Software"), to deal in the Software without
  7.  * restriction, including without limitation the rights to use, copy,
  8.  * modify, merge, publish, distribute, sublicense, and/or sell copies
  9.  * of the Software, and to permit persons to whom the Software is
  10.  * furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice shall be
  13.  * included in all copies or substantial portions of the Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16.  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18.  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  19.  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  20.  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  *
  24.  **********************************************************/
  25.  
  26. #include "svga_cmd.h"
  27. #include "svga_debug.h"
  28.  
  29. #include "pipe/p_defines.h"
  30. #include "util/u_pack_color.h"
  31.  
  32. #include "svga_context.h"
  33. #include "svga_state.h"
  34. #include "svga_surface.h"
  35.  
  36.  
  37. static enum pipe_error
  38. try_clear(struct svga_context *svga,
  39.           unsigned buffers,
  40.           const union pipe_color_union *color,
  41.           double depth,
  42.           unsigned stencil)
  43. {
  44.    enum pipe_error ret = PIPE_OK;
  45.    SVGA3dRect rect = { 0, 0, 0, 0 };
  46.    boolean restore_viewport = FALSE;
  47.    SVGA3dClearFlag flags = 0;
  48.    struct pipe_framebuffer_state *fb = &svga->curr.framebuffer;
  49.    union util_color uc = {0};
  50.  
  51.    ret = svga_update_state(svga, SVGA_STATE_HW_CLEAR);
  52.    if (ret != PIPE_OK)
  53.       return ret;
  54.  
  55.    if (svga->rebind.rendertargets) {
  56.       ret = svga_reemit_framebuffer_bindings(svga);
  57.       if (ret != PIPE_OK) {
  58.          return ret;
  59.       }
  60.    }
  61.  
  62.    if (buffers & PIPE_CLEAR_COLOR) {
  63.       flags |= SVGA3D_CLEAR_COLOR;
  64.       util_pack_color(color->f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
  65.  
  66.       rect.w = fb->width;
  67.       rect.h = fb->height;
  68.    }
  69.  
  70.    if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && fb->zsbuf) {
  71.       if (buffers & PIPE_CLEAR_DEPTH)
  72.          flags |= SVGA3D_CLEAR_DEPTH;
  73.  
  74.       if ((svga->curr.framebuffer.zsbuf->format == PIPE_FORMAT_S8_UINT_Z24_UNORM) &&
  75.           (buffers & PIPE_CLEAR_STENCIL))
  76.          flags |= SVGA3D_CLEAR_STENCIL;
  77.  
  78.       rect.w = MAX2(rect.w, fb->zsbuf->width);
  79.       rect.h = MAX2(rect.h, fb->zsbuf->height);
  80.    }
  81.  
  82.    if (memcmp(&rect, &svga->state.hw_clear.viewport, sizeof(rect)) != 0) {
  83.       restore_viewport = TRUE;
  84.       ret = SVGA3D_SetViewport(svga->swc, &rect);
  85.       if (ret != PIPE_OK)
  86.          return ret;
  87.    }
  88.  
  89.    ret = SVGA3D_ClearRect(svga->swc, flags, uc.ui[0], (float) depth, stencil,
  90.                           rect.x, rect.y, rect.w, rect.h);
  91.    if (ret != PIPE_OK)
  92.       return ret;
  93.  
  94.    if (restore_viewport) {
  95.       memcpy(&rect, &svga->state.hw_clear.viewport, sizeof rect);
  96.       ret = SVGA3D_SetViewport(svga->swc, &rect);
  97.    }
  98.    
  99.    return ret;
  100. }
  101.  
  102. /**
  103.  * Clear the given surface to the specified value.
  104.  * No masking, no scissor (clear entire buffer).
  105.  */
  106. void
  107. svga_clear(struct pipe_context *pipe, unsigned buffers,
  108.            const union pipe_color_union *color,
  109.            double depth, unsigned stencil)
  110. {
  111.    struct svga_context *svga = svga_context( pipe );
  112.    enum pipe_error ret;
  113.  
  114.    if (buffers & PIPE_CLEAR_COLOR) {
  115.       struct svga_winsys_surface *h = NULL;
  116.       if (svga->curr.framebuffer.cbufs[0]) {
  117.          h = svga_surface(svga->curr.framebuffer.cbufs[0])->handle;
  118.       }
  119.       SVGA_DBG(DEBUG_DMA, "clear sid %p\n", h);
  120.    }
  121.  
  122.    /* flush any queued prims (don't want them to appear after the clear!) */
  123.    svga_hwtnl_flush_retry(svga);
  124.  
  125.    ret = try_clear( svga, buffers, color, depth, stencil );
  126.  
  127.    if (ret == PIPE_ERROR_OUT_OF_MEMORY) {
  128.       /* Flush command buffer and retry:
  129.        */
  130.       svga_context_flush( svga, NULL );
  131.  
  132.       ret = try_clear( svga, buffers, color, depth, stencil );
  133.    }
  134.  
  135.    /*
  136.     * Mark target surfaces as dirty
  137.     * TODO Mark only cleared surfaces.
  138.     */
  139.    svga_mark_surfaces_dirty(svga);
  140.  
  141.    assert (ret == PIPE_OK);
  142. }
  143.