Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2006 VMware, Inc.
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the
  8.  * "Software"), to deal in the Software without restriction, including
  9.  * without limitation the rights to use, copy, modify, merge, publish,
  10.  * distribute, sub license, and/or sell copies of the Software, and to
  11.  * permit persons to whom the Software is furnished to do so, subject to
  12.  * the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice (including the
  15.  * next paragraph) shall be included in all copies or substantial portions
  16.  * of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  21.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  22.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  23.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  24.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  **************************************************************************/
  27.  
  28.  
  29. #include "main/enums.h"
  30. #include "main/imports.h"
  31. #include "main/macros.h"
  32. #include "main/mtypes.h"
  33. #include "main/fbobject.h"
  34. #include "main/framebuffer.h"
  35. #include "main/renderbuffer.h"
  36. #include "main/context.h"
  37. #include "main/teximage.h"
  38. #include "main/image.h"
  39. #include "main/condrender.h"
  40. #include "util/hash_table.h"
  41. #include "util/set.h"
  42.  
  43. #include "swrast/swrast.h"
  44. #include "drivers/common/meta.h"
  45.  
  46. #include "intel_batchbuffer.h"
  47. #include "intel_buffers.h"
  48. #include "intel_blit.h"
  49. #include "intel_fbo.h"
  50. #include "intel_mipmap_tree.h"
  51. #include "intel_image.h"
  52. #include "intel_screen.h"
  53. #include "intel_tex.h"
  54. #include "brw_context.h"
  55.  
  56. #define FILE_DEBUG_FLAG DEBUG_FBO
  57.  
  58. /**
  59.  * Create a new framebuffer object.
  60.  */
  61. static struct gl_framebuffer *
  62. intel_new_framebuffer(struct gl_context * ctx, GLuint name)
  63. {
  64.    /* Only drawable state in intel_framebuffer at this time, just use Mesa's
  65.     * class
  66.     */
  67.    return _mesa_new_framebuffer(ctx, name);
  68. }
  69.  
  70.  
  71. /** Called by gl_renderbuffer::Delete() */
  72. static void
  73. intel_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
  74. {
  75.    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
  76.  
  77.    assert(irb);
  78.  
  79.    intel_miptree_release(&irb->mt);
  80.    intel_miptree_release(&irb->singlesample_mt);
  81.  
  82.    _mesa_delete_renderbuffer(ctx, rb);
  83. }
  84.  
  85. /**
  86.  * \brief Downsample a winsys renderbuffer from mt to singlesample_mt.
  87.  *
  88.  * If the miptree needs no downsample, then skip.
  89.  */
  90. void
  91. intel_renderbuffer_downsample(struct brw_context *brw,
  92.                               struct intel_renderbuffer *irb)
  93. {
  94.    if (!irb->need_downsample)
  95.       return;
  96.    intel_miptree_updownsample(brw, irb->mt, irb->singlesample_mt);
  97.    irb->need_downsample = false;
  98. }
  99.  
  100. /**
  101.  * \brief Upsample a winsys renderbuffer from singlesample_mt to mt.
  102.  *
  103.  * The upsample is done unconditionally.
  104.  */
  105. void
  106. intel_renderbuffer_upsample(struct brw_context *brw,
  107.                             struct intel_renderbuffer *irb)
  108. {
  109.    assert(!irb->need_downsample);
  110.  
  111.    intel_miptree_updownsample(brw, irb->singlesample_mt, irb->mt);
  112. }
  113.  
  114. /**
  115.  * \see dd_function_table::MapRenderbuffer
  116.  */
  117. static void
  118. intel_map_renderbuffer(struct gl_context *ctx,
  119.                        struct gl_renderbuffer *rb,
  120.                        GLuint x, GLuint y, GLuint w, GLuint h,
  121.                        GLbitfield mode,
  122.                        GLubyte **out_map,
  123.                        GLint *out_stride)
  124. {
  125.    struct brw_context *brw = brw_context(ctx);
  126.    struct swrast_renderbuffer *srb = (struct swrast_renderbuffer *)rb;
  127.    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
  128.    struct intel_mipmap_tree *mt;
  129.    void *map;
  130.    ptrdiff_t stride;
  131.  
  132.    if (srb->Buffer) {
  133.       /* this is a malloc'd renderbuffer (accum buffer), not an irb */
  134.       GLint bpp = _mesa_get_format_bytes(rb->Format);
  135.       GLint rowStride = srb->RowStride;
  136.       *out_map = (GLubyte *) srb->Buffer + y * rowStride + x * bpp;
  137.       *out_stride = rowStride;
  138.       return;
  139.    }
  140.  
  141.    intel_prepare_render(brw);
  142.  
  143.    /* The MapRenderbuffer API should always return a single-sampled mapping.
  144.     * The case we are asked to map multisampled RBs is in glReadPixels() (or
  145.     * swrast paths like glCopyTexImage()) from a window-system MSAA buffer,
  146.     * and GL expects an automatic resolve to happen.
  147.     *
  148.     * If it's a color miptree, there is a ->singlesample_mt which wraps the
  149.     * actual window system renderbuffer (which we may resolve to at any time),
  150.     * while the miptree itself is our driver-private allocation.  If it's a
  151.     * depth or stencil miptree, we have a private MSAA buffer and no shared
  152.     * singlesample buffer, and since we don't expect anybody to ever actually
  153.     * resolve it, we just make a temporary singlesample buffer now when we
  154.     * have to.
  155.     */
  156.    if (rb->NumSamples > 1) {
  157.       if (!irb->singlesample_mt) {
  158.          irb->singlesample_mt =
  159.             intel_miptree_create_for_renderbuffer(brw, irb->mt->format,
  160.                                                   rb->Width, rb->Height,
  161.                                                   0 /*num_samples*/);
  162.          if (!irb->singlesample_mt)
  163.             goto fail;
  164.          irb->singlesample_mt_is_tmp = true;
  165.          irb->need_downsample = true;
  166.       }
  167.  
  168.       intel_renderbuffer_downsample(brw, irb);
  169.       mt = irb->singlesample_mt;
  170.  
  171.       irb->need_map_upsample = mode & GL_MAP_WRITE_BIT;
  172.    } else {
  173.       mt = irb->mt;
  174.    }
  175.  
  176.    /* For a window-system renderbuffer, we need to flip the mapping we receive
  177.     * upside-down.  So we need to ask for a rectangle on flipped vertically, and
  178.     * we then return a pointer to the bottom of it with a negative stride.
  179.     */
  180.    if (rb->Name == 0) {
  181.       y = rb->Height - y - h;
  182.    }
  183.  
  184.    intel_miptree_map(brw, mt, irb->mt_level, irb->mt_layer,
  185.                      x, y, w, h, mode, &map, &stride);
  186.  
  187.    if (rb->Name == 0) {
  188.       map += (h - 1) * stride;
  189.       stride = -stride;
  190.    }
  191.  
  192.    DBG("%s: rb %d (%s) mt mapped: (%d, %d) (%dx%d) -> %p/%"PRIdPTR"\n",
  193.        __func__, rb->Name, _mesa_get_format_name(rb->Format),
  194.        x, y, w, h, map, stride);
  195.  
  196.    *out_map = map;
  197.    *out_stride = stride;
  198.    return;
  199.  
  200. fail:
  201.    *out_map = NULL;
  202.    *out_stride = 0;
  203. }
  204.  
  205. /**
  206.  * \see dd_function_table::UnmapRenderbuffer
  207.  */
  208. static void
  209. intel_unmap_renderbuffer(struct gl_context *ctx,
  210.                          struct gl_renderbuffer *rb)
  211. {
  212.    struct brw_context *brw = brw_context(ctx);
  213.    struct swrast_renderbuffer *srb = (struct swrast_renderbuffer *)rb;
  214.    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
  215.    struct intel_mipmap_tree *mt;
  216.  
  217.    DBG("%s: rb %d (%s)\n", __func__,
  218.        rb->Name, _mesa_get_format_name(rb->Format));
  219.  
  220.    if (srb->Buffer) {
  221.       /* this is a malloc'd renderbuffer (accum buffer) */
  222.       /* nothing to do */
  223.       return;
  224.    }
  225.  
  226.    if (rb->NumSamples > 1) {
  227.       mt = irb->singlesample_mt;
  228.    } else {
  229.       mt = irb->mt;
  230.    }
  231.  
  232.    intel_miptree_unmap(brw, mt, irb->mt_level, irb->mt_layer);
  233.  
  234.    if (irb->need_map_upsample) {
  235.       intel_renderbuffer_upsample(brw, irb);
  236.       irb->need_map_upsample = false;
  237.    }
  238.  
  239.    if (irb->singlesample_mt_is_tmp)
  240.       intel_miptree_release(&irb->singlesample_mt);
  241. }
  242.  
  243.  
  244. /**
  245.  * Round up the requested multisample count to the next supported sample size.
  246.  */
  247. unsigned
  248. intel_quantize_num_samples(struct intel_screen *intel, unsigned num_samples)
  249. {
  250.    const int *msaa_modes = intel_supported_msaa_modes(intel);
  251.    int quantized_samples = 0;
  252.  
  253.    for (int i = 0; msaa_modes[i] != -1; ++i) {
  254.       if (msaa_modes[i] >= num_samples)
  255.          quantized_samples = msaa_modes[i];
  256.       else
  257.          break;
  258.    }
  259.  
  260.    return quantized_samples;
  261. }
  262.  
  263. static mesa_format
  264. intel_renderbuffer_format(struct gl_context * ctx, GLenum internalFormat)
  265. {
  266.    struct brw_context *brw = brw_context(ctx);
  267.  
  268.    switch (internalFormat) {
  269.    default:
  270.       /* Use the same format-choice logic as for textures.
  271.        * Renderbuffers aren't any different from textures for us,
  272.        * except they're less useful because you can't texture with
  273.        * them.
  274.        */
  275.       return ctx->Driver.ChooseTextureFormat(ctx, GL_TEXTURE_2D,
  276.                                              internalFormat,
  277.                                              GL_NONE, GL_NONE);
  278.       break;
  279.    case GL_STENCIL_INDEX:
  280.    case GL_STENCIL_INDEX1_EXT:
  281.    case GL_STENCIL_INDEX4_EXT:
  282.    case GL_STENCIL_INDEX8_EXT:
  283.    case GL_STENCIL_INDEX16_EXT:
  284.       /* These aren't actual texture formats, so force them here. */
  285.       if (brw->has_separate_stencil) {
  286.          return MESA_FORMAT_S_UINT8;
  287.       } else {
  288.          assert(!brw->must_use_separate_stencil);
  289.          return MESA_FORMAT_Z24_UNORM_S8_UINT;
  290.       }
  291.    }
  292. }
  293.  
  294. static GLboolean
  295. intel_alloc_private_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer *rb,
  296.                                          GLenum internalFormat,
  297.                                          GLuint width, GLuint height)
  298. {
  299.    struct brw_context *brw = brw_context(ctx);
  300.    struct intel_screen *screen = brw->intelScreen;
  301.    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
  302.  
  303.    assert(rb->Format != MESA_FORMAT_NONE);
  304.  
  305.    rb->NumSamples = intel_quantize_num_samples(screen, rb->NumSamples);
  306.    rb->Width = width;
  307.    rb->Height = height;
  308.    rb->_BaseFormat = _mesa_base_fbo_format(ctx, internalFormat);
  309.  
  310.    intel_miptree_release(&irb->mt);
  311.  
  312.    DBG("%s: %s: %s (%dx%d)\n", __func__,
  313.        _mesa_lookup_enum_by_nr(internalFormat),
  314.        _mesa_get_format_name(rb->Format), width, height);
  315.  
  316.    if (width == 0 || height == 0)
  317.       return true;
  318.  
  319.    irb->mt = intel_miptree_create_for_renderbuffer(brw, rb->Format,
  320.                                                    width, height,
  321.                                                    rb->NumSamples);
  322.    if (!irb->mt)
  323.       return false;
  324.  
  325.    irb->layer_count = 1;
  326.  
  327.    return true;
  328. }
  329.  
  330. /**
  331.  * Called via glRenderbufferStorageEXT() to set the format and allocate
  332.  * storage for a user-created renderbuffer.
  333.  */
  334. static GLboolean
  335. intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer *rb,
  336.                                  GLenum internalFormat,
  337.                                  GLuint width, GLuint height)
  338. {
  339.    rb->Format = intel_renderbuffer_format(ctx, internalFormat);
  340.    return intel_alloc_private_renderbuffer_storage(ctx, rb, internalFormat, width, height);
  341. }
  342.  
  343. static void
  344. intel_image_target_renderbuffer_storage(struct gl_context *ctx,
  345.                                         struct gl_renderbuffer *rb,
  346.                                         void *image_handle)
  347. {
  348.    struct brw_context *brw = brw_context(ctx);
  349.    struct intel_renderbuffer *irb;
  350.    __DRIscreen *screen;
  351.    __DRIimage *image;
  352.  
  353.    screen = brw->intelScreen->driScrnPriv;
  354.    image = screen->dri2.image->lookupEGLImage(screen, image_handle,
  355.                                               screen->loaderPrivate);
  356.    if (image == NULL)
  357.       return;
  358.  
  359.    if (image->planar_format && image->planar_format->nplanes > 1) {
  360.       _mesa_error(ctx, GL_INVALID_OPERATION,
  361.             "glEGLImageTargetRenderbufferStorage(planar buffers are not "
  362.                "supported as render targets.");
  363.       return;
  364.    }
  365.  
  366.    /* __DRIimage is opaque to the core so it has to be checked here */
  367.    switch (image->format) {
  368.    case MESA_FORMAT_R8G8B8A8_UNORM:
  369.       _mesa_error(ctx, GL_INVALID_OPERATION,
  370.             "glEGLImageTargetRenderbufferStorage(unsupported image format");
  371.       return;
  372.       break;
  373.    default:
  374.       break;
  375.    }
  376.  
  377.    irb = intel_renderbuffer(rb);
  378.    intel_miptree_release(&irb->mt);
  379.  
  380.    /* Disable creation of the miptree's aux buffers because the driver exposes
  381.     * no EGL API to manage them. That is, there is no API for resolving the aux
  382.     * buffer's content to the main buffer nor for invalidating the aux buffer's
  383.     * content.
  384.     */
  385.    irb->mt = intel_miptree_create_for_bo(brw,
  386.                                          image->bo,
  387.                                          image->format,
  388.                                          image->offset,
  389.                                          image->width,
  390.                                          image->height,
  391.                                          1,
  392.                                          image->pitch,
  393.                                          true /*disable_aux_buffers*/);
  394.    if (!irb->mt)
  395.       return;
  396.  
  397.    rb->InternalFormat = image->internal_format;
  398.    rb->Width = image->width;
  399.    rb->Height = image->height;
  400.    rb->Format = image->format;
  401.    rb->_BaseFormat = _mesa_get_format_base_format(image->format);
  402.    rb->NeedsFinishRenderTexture = true;
  403.    irb->layer_count = 1;
  404. }
  405.  
  406. /**
  407.  * Called by _mesa_resize_framebuffer() for each hardware renderbuffer when a
  408.  * window system framebuffer is resized.
  409.  *
  410.  * Any actual buffer reallocations for hardware renderbuffers (which would
  411.  * have triggered _mesa_resize_framebuffer()) were done by
  412.  * intel_process_dri2_buffer().
  413.  */
  414. static GLboolean
  415. intel_alloc_window_storage(struct gl_context * ctx, struct gl_renderbuffer *rb,
  416.                            GLenum internalFormat, GLuint width, GLuint height)
  417. {
  418.    assert(rb->Name == 0);
  419.    rb->Width = width;
  420.    rb->Height = height;
  421.    rb->InternalFormat = internalFormat;
  422.  
  423.    return true;
  424. }
  425.  
  426. /** Dummy function for gl_renderbuffer::AllocStorage() */
  427. static GLboolean
  428. intel_nop_alloc_storage(struct gl_context * ctx, struct gl_renderbuffer *rb,
  429.                         GLenum internalFormat, GLuint width, GLuint height)
  430. {
  431.    _mesa_problem(ctx, "intel_nop_alloc_storage should never be called.");
  432.    return false;
  433. }
  434.  
  435. /**
  436.  * Create a new intel_renderbuffer which corresponds to an on-screen window,
  437.  * not a user-created renderbuffer.
  438.  *
  439.  * \param num_samples must be quantized.
  440.  */
  441. struct intel_renderbuffer *
  442. intel_create_renderbuffer(mesa_format format, unsigned num_samples)
  443. {
  444.    struct intel_renderbuffer *irb;
  445.    struct gl_renderbuffer *rb;
  446.  
  447.    GET_CURRENT_CONTEXT(ctx);
  448.  
  449.    irb = CALLOC_STRUCT(intel_renderbuffer);
  450.    if (!irb) {
  451.       _mesa_error(ctx, GL_OUT_OF_MEMORY, "creating renderbuffer");
  452.       return NULL;
  453.    }
  454.  
  455.    rb = &irb->Base.Base;
  456.    irb->layer_count = 1;
  457.  
  458.    _mesa_init_renderbuffer(rb, 0);
  459.    rb->ClassID = INTEL_RB_CLASS;
  460.    rb->_BaseFormat = _mesa_get_format_base_format(format);
  461.    rb->Format = format;
  462.    rb->InternalFormat = rb->_BaseFormat;
  463.    rb->NumSamples = num_samples;
  464.  
  465.    /* intel-specific methods */
  466.    rb->Delete = intel_delete_renderbuffer;
  467.    rb->AllocStorage = intel_alloc_window_storage;
  468.  
  469.    return irb;
  470. }
  471.  
  472. /**
  473.  * Private window-system buffers (as opposed to ones shared with the display
  474.  * server created with intel_create_renderbuffer()) are most similar in their
  475.  * handling to user-created renderbuffers, but they have a resize handler that
  476.  * may be called at intel_update_renderbuffers() time.
  477.  *
  478.  * \param num_samples must be quantized.
  479.  */
  480. struct intel_renderbuffer *
  481. intel_create_private_renderbuffer(mesa_format format, unsigned num_samples)
  482. {
  483.    struct intel_renderbuffer *irb;
  484.  
  485.    irb = intel_create_renderbuffer(format, num_samples);
  486.    irb->Base.Base.AllocStorage = intel_alloc_private_renderbuffer_storage;
  487.  
  488.    return irb;
  489. }
  490.  
  491. /**
  492.  * Create a new renderbuffer object.
  493.  * Typically called via glBindRenderbufferEXT().
  494.  */
  495. static struct gl_renderbuffer *
  496. intel_new_renderbuffer(struct gl_context * ctx, GLuint name)
  497. {
  498.    struct intel_renderbuffer *irb;
  499.    struct gl_renderbuffer *rb;
  500.  
  501.    irb = CALLOC_STRUCT(intel_renderbuffer);
  502.    if (!irb) {
  503.       _mesa_error(ctx, GL_OUT_OF_MEMORY, "creating renderbuffer");
  504.       return NULL;
  505.    }
  506.  
  507.    rb = &irb->Base.Base;
  508.  
  509.    _mesa_init_renderbuffer(rb, name);
  510.    rb->ClassID = INTEL_RB_CLASS;
  511.  
  512.    /* intel-specific methods */
  513.    rb->Delete = intel_delete_renderbuffer;
  514.    rb->AllocStorage = intel_alloc_renderbuffer_storage;
  515.    /* span routines set in alloc_storage function */
  516.  
  517.    return rb;
  518. }
  519.  
  520. static bool
  521. intel_renderbuffer_update_wrapper(struct brw_context *brw,
  522.                                   struct intel_renderbuffer *irb,
  523.                                   struct gl_texture_image *image,
  524.                                   uint32_t layer,
  525.                                   bool layered)
  526. {
  527.    struct gl_renderbuffer *rb = &irb->Base.Base;
  528.    struct intel_texture_image *intel_image = intel_texture_image(image);
  529.    struct intel_mipmap_tree *mt = intel_image->mt;
  530.    int level = image->Level;
  531.  
  532.    rb->AllocStorage = intel_nop_alloc_storage;
  533.  
  534.    /* adjust for texture view parameters */
  535.    layer += image->TexObject->MinLayer;
  536.    level += image->TexObject->MinLevel;
  537.  
  538.    intel_miptree_check_level_layer(mt, level, layer);
  539.    irb->mt_level = level;
  540.  
  541.    int layer_multiplier;
  542.    switch (mt->msaa_layout) {
  543.       case INTEL_MSAA_LAYOUT_UMS:
  544.       case INTEL_MSAA_LAYOUT_CMS:
  545.          layer_multiplier = mt->num_samples;
  546.          break;
  547.  
  548.       default:
  549.          layer_multiplier = 1;
  550.    }
  551.  
  552.    irb->mt_layer = layer_multiplier * layer;
  553.  
  554.    if (layered) {
  555.       irb->layer_count = image->TexObject->NumLayers ?: mt->level[level].depth / layer_multiplier;
  556.    } else {
  557.       irb->layer_count = 1;
  558.    }
  559.  
  560.    intel_miptree_reference(&irb->mt, mt);
  561.  
  562.    intel_renderbuffer_set_draw_offset(irb);
  563.  
  564.    if (intel_miptree_wants_hiz_buffer(brw, mt)) {
  565.       intel_miptree_alloc_hiz(brw, mt);
  566.       if (!mt->hiz_buf)
  567.          return false;
  568.    }
  569.  
  570.    return true;
  571. }
  572.  
  573. void
  574. intel_renderbuffer_set_draw_offset(struct intel_renderbuffer *irb)
  575. {
  576.    unsigned int dst_x, dst_y;
  577.  
  578.    /* compute offset of the particular 2D image within the texture region */
  579.    intel_miptree_get_image_offset(irb->mt,
  580.                                   irb->mt_level,
  581.                                   irb->mt_layer,
  582.                                   &dst_x, &dst_y);
  583.  
  584.    irb->draw_x = dst_x;
  585.    irb->draw_y = dst_y;
  586. }
  587.  
  588. /**
  589.  * Called by glFramebufferTexture[123]DEXT() (and other places) to
  590.  * prepare for rendering into texture memory.  This might be called
  591.  * many times to choose different texture levels, cube faces, etc
  592.  * before intel_finish_render_texture() is ever called.
  593.  */
  594. static void
  595. intel_render_texture(struct gl_context * ctx,
  596.                      struct gl_framebuffer *fb,
  597.                      struct gl_renderbuffer_attachment *att)
  598. {
  599.    struct brw_context *brw = brw_context(ctx);
  600.    struct gl_renderbuffer *rb = att->Renderbuffer;
  601.    struct intel_renderbuffer *irb = intel_renderbuffer(rb);
  602.    struct gl_texture_image *image = rb->TexImage;
  603.    struct intel_texture_image *intel_image = intel_texture_image(image);
  604.    struct intel_mipmap_tree *mt = intel_image->mt;
  605.    int layer;
  606.  
  607.    (void) fb;
  608.  
  609.    if (att->CubeMapFace > 0) {
  610.       assert(att->Zoffset == 0);
  611.       layer = att->CubeMapFace;
  612.    } else {
  613.       layer = att->Zoffset;
  614.    }
  615.  
  616.    if (!intel_image->mt) {
  617.       /* Fallback on drawing to a texture that doesn't have a miptree
  618.        * (has a border, width/height 0, etc.)
  619.        */
  620.       _swrast_render_texture(ctx, fb, att);
  621.       return;
  622.    }
  623.  
  624.    intel_miptree_check_level_layer(mt, att->TextureLevel, layer);
  625.  
  626.    if (!intel_renderbuffer_update_wrapper(brw, irb, image, layer, att->Layered)) {
  627.        _swrast_render_texture(ctx, fb, att);
  628.        return;
  629.    }
  630.  
  631.    DBG("Begin render %s texture tex=%u w=%d h=%d d=%d refcount=%d\n",
  632.        _mesa_get_format_name(image->TexFormat),
  633.        att->Texture->Name, image->Width, image->Height, image->Depth,
  634.        rb->RefCount);
  635. }
  636.  
  637.  
  638. #define fbo_incomplete(fb, ...) do {                                          \
  639.       static GLuint msg_id = 0;                                               \
  640.       if (unlikely(ctx->Const.ContextFlags & GL_CONTEXT_FLAG_DEBUG_BIT)) {    \
  641.          _mesa_gl_debug(ctx, &msg_id,                                         \
  642.                         MESA_DEBUG_SOURCE_API,                                \
  643.                         MESA_DEBUG_TYPE_OTHER,                                \
  644.                         MESA_DEBUG_SEVERITY_MEDIUM,                           \
  645.                         __VA_ARGS__);                                         \
  646.       }                                                                       \
  647.       DBG(__VA_ARGS__);                                                       \
  648.       fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED;                               \
  649.    } while (0)
  650.  
  651. /**
  652.  * Do additional "completeness" testing of a framebuffer object.
  653.  */
  654. static void
  655. intel_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
  656. {
  657.    struct brw_context *brw = brw_context(ctx);
  658.    struct intel_renderbuffer *depthRb =
  659.       intel_get_renderbuffer(fb, BUFFER_DEPTH);
  660.    struct intel_renderbuffer *stencilRb =
  661.       intel_get_renderbuffer(fb, BUFFER_STENCIL);
  662.    struct intel_mipmap_tree *depth_mt = NULL, *stencil_mt = NULL;
  663.    int i;
  664.  
  665.    DBG("%s() on fb %p (%s)\n", __func__,
  666.        fb, (fb == ctx->DrawBuffer ? "drawbuffer" :
  667.             (fb == ctx->ReadBuffer ? "readbuffer" : "other buffer")));
  668.  
  669.    if (depthRb)
  670.       depth_mt = depthRb->mt;
  671.    if (stencilRb) {
  672.       stencil_mt = stencilRb->mt;
  673.       if (stencil_mt->stencil_mt)
  674.          stencil_mt = stencil_mt->stencil_mt;
  675.    }
  676.  
  677.    if (depth_mt && stencil_mt) {
  678.       if (brw->gen >= 6) {
  679.          /* For gen >= 6, we are using the lod/minimum-array-element fields
  680.           * and supporting layered rendering. This means that we must restrict
  681.           * the depth & stencil attachments to match in various more retrictive
  682.           * ways. (width, height, depth, LOD and layer)
  683.           */
  684.          if (depth_mt->physical_width0 != stencil_mt->physical_width0 ||
  685.              depth_mt->physical_height0 != stencil_mt->physical_height0 ||
  686.              depth_mt->physical_depth0 != stencil_mt->physical_depth0 ||
  687.              depthRb->mt_level != stencilRb->mt_level ||
  688.              depthRb->mt_layer != stencilRb->mt_layer) {
  689.             fbo_incomplete(fb,
  690.                            "FBO incomplete: depth and stencil must match in"
  691.                            "width, height, depth, LOD and layer\n");
  692.          }
  693.       }
  694.       if (depth_mt == stencil_mt) {
  695.          /* For true packed depth/stencil (not faked on prefers-separate-stencil
  696.           * hardware) we need to be sure they're the same level/layer, since
  697.           * we'll be emitting a single packet describing the packed setup.
  698.           */
  699.          if (depthRb->mt_level != stencilRb->mt_level ||
  700.              depthRb->mt_layer != stencilRb->mt_layer) {
  701.             fbo_incomplete(fb,
  702.                            "FBO incomplete: depth image level/layer %d/%d != "
  703.                            "stencil image %d/%d\n",
  704.                            depthRb->mt_level,
  705.                            depthRb->mt_layer,
  706.                            stencilRb->mt_level,
  707.                            stencilRb->mt_layer);
  708.          }
  709.       } else {
  710.          if (!brw->has_separate_stencil) {
  711.             fbo_incomplete(fb, "FBO incomplete: separate stencil "
  712.                            "unsupported\n");
  713.          }
  714.          if (stencil_mt->format != MESA_FORMAT_S_UINT8) {
  715.             fbo_incomplete(fb, "FBO incomplete: separate stencil is %s "
  716.                            "instead of S8\n",
  717.                            _mesa_get_format_name(stencil_mt->format));
  718.          }
  719.          if (brw->gen < 7 && !intel_renderbuffer_has_hiz(depthRb)) {
  720.             /* Before Gen7, separate depth and stencil buffers can be used
  721.              * only if HiZ is enabled. From the Sandybridge PRM, Volume 2,
  722.              * Part 1, Bit 3DSTATE_DEPTH_BUFFER.SeparateStencilBufferEnable:
  723.              *     [DevSNB]: This field must be set to the same value (enabled
  724.              *     or disabled) as Hierarchical Depth Buffer Enable.
  725.              */
  726.             fbo_incomplete(fb, "FBO incomplete: separate stencil "
  727.                            "without HiZ\n");
  728.          }
  729.       }
  730.    }
  731.  
  732.    for (i = 0; i < ARRAY_SIZE(fb->Attachment); i++) {
  733.       struct gl_renderbuffer *rb;
  734.       struct intel_renderbuffer *irb;
  735.  
  736.       if (fb->Attachment[i].Type == GL_NONE)
  737.          continue;
  738.  
  739.       /* A supported attachment will have a Renderbuffer set either
  740.        * from being a Renderbuffer or being a texture that got the
  741.        * intel_wrap_texture() treatment.
  742.        */
  743.       rb = fb->Attachment[i].Renderbuffer;
  744.       if (rb == NULL) {
  745.          fbo_incomplete(fb, "FBO incomplete: attachment without "
  746.                         "renderbuffer\n");
  747.          continue;
  748.       }
  749.  
  750.       if (fb->Attachment[i].Type == GL_TEXTURE) {
  751.          if (rb->TexImage->Border) {
  752.             fbo_incomplete(fb, "FBO incomplete: texture with border\n");
  753.             continue;
  754.          }
  755.       }
  756.  
  757.       irb = intel_renderbuffer(rb);
  758.       if (irb == NULL) {
  759.          fbo_incomplete(fb, "FBO incomplete: software rendering "
  760.                         "renderbuffer\n");
  761.          continue;
  762.       }
  763.  
  764.       if (!brw_render_target_supported(brw, rb)) {
  765.          fbo_incomplete(fb, "FBO incomplete: Unsupported HW "
  766.                         "texture/renderbuffer format attached: %s\n",
  767.                         _mesa_get_format_name(intel_rb_format(irb)));
  768.       }
  769.    }
  770. }
  771.  
  772. /**
  773.  * Try to do a glBlitFramebuffer using glCopyTexSubImage2D
  774.  * We can do this when the dst renderbuffer is actually a texture and
  775.  * there is no scaling, mirroring or scissoring.
  776.  *
  777.  * \return new buffer mask indicating the buffers left to blit using the
  778.  *         normal path.
  779.  */
  780. static GLbitfield
  781. intel_blit_framebuffer_with_blitter(struct gl_context *ctx,
  782.                                     const struct gl_framebuffer *readFb,
  783.                                     const struct gl_framebuffer *drawFb,
  784.                                     GLint srcX0, GLint srcY0,
  785.                                     GLint srcX1, GLint srcY1,
  786.                                     GLint dstX0, GLint dstY0,
  787.                                     GLint dstX1, GLint dstY1,
  788.                                     GLbitfield mask, GLenum filter)
  789. {
  790.    struct brw_context *brw = brw_context(ctx);
  791.  
  792.    /* Sync up the state of window system buffers.  We need to do this before
  793.     * we go looking for the buffers.
  794.     */
  795.    intel_prepare_render(brw);
  796.  
  797.    if (mask & GL_COLOR_BUFFER_BIT) {
  798.       GLint i;
  799.       struct gl_renderbuffer *src_rb = readFb->_ColorReadBuffer;
  800.       struct intel_renderbuffer *src_irb = intel_renderbuffer(src_rb);
  801.  
  802.       if (!src_irb) {
  803.          perf_debug("glBlitFramebuffer(): missing src renderbuffer.  "
  804.                     "Falling back to software rendering.\n");
  805.          return mask;
  806.       }
  807.  
  808.       /* If the source and destination are the same size with no mirroring,
  809.        * the rectangles are within the size of the texture and there is no
  810.        * scissor, then we can probably use the blit engine.
  811.        */
  812.       if (!(srcX0 - srcX1 == dstX0 - dstX1 &&
  813.             srcY0 - srcY1 == dstY0 - dstY1 &&
  814.             srcX1 >= srcX0 &&
  815.             srcY1 >= srcY0 &&
  816.             srcX0 >= 0 && srcX1 <= readFb->Width &&
  817.             srcY0 >= 0 && srcY1 <= readFb->Height &&
  818.             dstX0 >= 0 && dstX1 <= drawFb->Width &&
  819.             dstY0 >= 0 && dstY1 <= drawFb->Height &&
  820.             !(ctx->Scissor.EnableFlags))) {
  821.          perf_debug("glBlitFramebuffer(): non-1:1 blit.  "
  822.                     "Falling back to software rendering.\n");
  823.          return mask;
  824.       }
  825.  
  826.       /* Blit to all active draw buffers.  We don't do any pre-checking,
  827.        * because we assume that copying to MRTs is rare, and failure midway
  828.        * through copying is even more rare.  Even if it was to occur, it's
  829.        * safe to let meta start the copy over from scratch, because
  830.        * glBlitFramebuffer completely overwrites the destination pixels, and
  831.        * results are undefined if any destination pixels have a dependency on
  832.        * source pixels.
  833.        */
  834.       for (i = 0; i < drawFb->_NumColorDrawBuffers; i++) {
  835.          struct gl_renderbuffer *dst_rb = drawFb->_ColorDrawBuffers[i];
  836.          struct intel_renderbuffer *dst_irb = intel_renderbuffer(dst_rb);
  837.  
  838.          if (!dst_irb) {
  839.             perf_debug("glBlitFramebuffer(): missing dst renderbuffer.  "
  840.                        "Falling back to software rendering.\n");
  841.             return mask;
  842.          }
  843.  
  844.          if (!intel_miptree_blit(brw,
  845.                                  src_irb->mt,
  846.                                  src_irb->mt_level, src_irb->mt_layer,
  847.                                  srcX0, srcY0, src_rb->Name == 0,
  848.                                  dst_irb->mt,
  849.                                  dst_irb->mt_level, dst_irb->mt_layer,
  850.                                  dstX0, dstY0, dst_rb->Name == 0,
  851.                                  dstX1 - dstX0, dstY1 - dstY0, GL_COPY)) {
  852.             perf_debug("glBlitFramebuffer(): unknown blit failure.  "
  853.                        "Falling back to software rendering.\n");
  854.             return mask;
  855.          }
  856.       }
  857.  
  858.       mask &= ~GL_COLOR_BUFFER_BIT;
  859.    }
  860.  
  861.    return mask;
  862. }
  863.  
  864. static void
  865. intel_blit_framebuffer(struct gl_context *ctx,
  866.                        struct gl_framebuffer *readFb,
  867.                        struct gl_framebuffer *drawFb,
  868.                        GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
  869.                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
  870.                        GLbitfield mask, GLenum filter)
  871. {
  872.    struct brw_context *brw = brw_context(ctx);
  873.  
  874.    /* Page 679 of OpenGL 4.4 spec says:
  875.     *    "Added BlitFramebuffer to commands affected by conditional rendering in
  876.     *     section 10.10 (Bug 9562)."
  877.     */
  878.    if (!_mesa_check_conditional_render(ctx))
  879.       return;
  880.  
  881.    mask = brw_blorp_framebuffer(brw, readFb, drawFb,
  882.                                 srcX0, srcY0, srcX1, srcY1,
  883.                                 dstX0, dstY0, dstX1, dstY1,
  884.                                 mask, filter);
  885.    if (mask == 0x0)
  886.       return;
  887.  
  888.    mask = _mesa_meta_BlitFramebuffer(ctx, readFb, drawFb,
  889.                                      srcX0, srcY0, srcX1, srcY1,
  890.                                      dstX0, dstY0, dstX1, dstY1,
  891.                                      mask, filter);
  892.    if (mask == 0x0)
  893.       return;
  894.  
  895.    if (brw->gen >= 8 && (mask & GL_STENCIL_BUFFER_BIT)) {
  896.       brw_meta_fbo_stencil_blit(brw_context(ctx), readFb, drawFb,
  897.                                 srcX0, srcY0, srcX1, srcY1,
  898.                                 dstX0, dstY0, dstX1, dstY1);
  899.       mask &= ~GL_STENCIL_BUFFER_BIT;
  900.       if (mask == 0x0)
  901.          return;
  902.    }
  903.  
  904.    /* Try using the BLT engine. */
  905.    mask = intel_blit_framebuffer_with_blitter(ctx, readFb, drawFb,
  906.                                               srcX0, srcY0, srcX1, srcY1,
  907.                                               dstX0, dstY0, dstX1, dstY1,
  908.                                               mask, filter);
  909.    if (mask == 0x0)
  910.       return;
  911.  
  912.    _swrast_BlitFramebuffer(ctx, readFb, drawFb,
  913.                            srcX0, srcY0, srcX1, srcY1,
  914.                            dstX0, dstY0, dstX1, dstY1,
  915.                            mask, filter);
  916. }
  917.  
  918. /**
  919.  * Gen4-5 implementation of glBlitFrameBuffer().
  920.  *
  921.  * Tries BLT, Meta, then swrast.
  922.  *
  923.  * Gen4-5 have a single ring for both 3D and BLT operations, so there's no
  924.  * inter-ring synchronization issues like on Gen6+.  It is apparently faster
  925.  * than using the 3D pipeline.  Original Gen4 also has to rebase and copy
  926.  * miptree slices in order to render to unaligned locations.
  927.  */
  928. static void
  929. gen4_blit_framebuffer(struct gl_context *ctx,
  930.                       struct gl_framebuffer *readFb,
  931.                       struct gl_framebuffer *drawFb,
  932.                       GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
  933.                       GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
  934.                       GLbitfield mask, GLenum filter)
  935. {
  936.    /* Page 679 of OpenGL 4.4 spec says:
  937.     * "Added BlitFramebuffer to commands affected by conditional rendering in
  938.     *  section 10.10 (Bug 9562)."
  939.     */
  940.    if (!_mesa_check_conditional_render(ctx))
  941.       return;
  942.  
  943.    mask = intel_blit_framebuffer_with_blitter(ctx, readFb, drawFb,
  944.                                               srcX0, srcY0, srcX1, srcY1,
  945.                                               dstX0, dstY0, dstX1, dstY1,
  946.                                               mask, filter);
  947.    if (mask == 0x0)
  948.       return;
  949.  
  950.    mask = _mesa_meta_BlitFramebuffer(ctx, readFb, drawFb,
  951.                                      srcX0, srcY0, srcX1, srcY1,
  952.                                      dstX0, dstY0, dstX1, dstY1,
  953.                                      mask, filter);
  954.    if (mask == 0x0)
  955.       return;
  956.  
  957.    _swrast_BlitFramebuffer(ctx, readFb, drawFb,
  958.                            srcX0, srcY0, srcX1, srcY1,
  959.                            dstX0, dstY0, dstX1, dstY1,
  960.                            mask, filter);
  961. }
  962.  
  963. /**
  964.  * Does the renderbuffer have hiz enabled?
  965.  */
  966. bool
  967. intel_renderbuffer_has_hiz(struct intel_renderbuffer *irb)
  968. {
  969.    return intel_miptree_level_has_hiz(irb->mt, irb->mt_level);
  970. }
  971.  
  972. bool
  973. intel_renderbuffer_resolve_hiz(struct brw_context *brw,
  974.                                struct intel_renderbuffer *irb)
  975. {
  976.    if (irb->mt)
  977.       return intel_miptree_slice_resolve_hiz(brw,
  978.                                              irb->mt,
  979.                                              irb->mt_level,
  980.                                              irb->mt_layer);
  981.  
  982.    return false;
  983. }
  984.  
  985. void
  986. intel_renderbuffer_att_set_needs_depth_resolve(struct gl_renderbuffer_attachment *att)
  987. {
  988.    struct intel_renderbuffer *irb = intel_renderbuffer(att->Renderbuffer);
  989.    if (irb->mt) {
  990.       if (att->Layered) {
  991.          intel_miptree_set_all_slices_need_depth_resolve(irb->mt, irb->mt_level);
  992.       } else {
  993.          intel_miptree_slice_set_needs_depth_resolve(irb->mt,
  994.                                                      irb->mt_level,
  995.                                                      irb->mt_layer);
  996.       }
  997.    }
  998. }
  999.  
  1000. bool
  1001. intel_renderbuffer_resolve_depth(struct brw_context *brw,
  1002.                                  struct intel_renderbuffer *irb)
  1003. {
  1004.    if (irb->mt)
  1005.       return intel_miptree_slice_resolve_depth(brw,
  1006.                                                irb->mt,
  1007.                                                irb->mt_level,
  1008.                                                irb->mt_layer);
  1009.  
  1010.    return false;
  1011. }
  1012.  
  1013. void
  1014. intel_renderbuffer_move_to_temp(struct brw_context *brw,
  1015.                                 struct intel_renderbuffer *irb,
  1016.                                 bool invalidate)
  1017. {
  1018.    struct gl_renderbuffer *rb =&irb->Base.Base;
  1019.    struct intel_texture_image *intel_image = intel_texture_image(rb->TexImage);
  1020.    struct intel_mipmap_tree *new_mt;
  1021.    int width, height, depth;
  1022.  
  1023.    intel_miptree_get_dimensions_for_image(rb->TexImage, &width, &height, &depth);
  1024.  
  1025.    new_mt = intel_miptree_create(brw, rb->TexImage->TexObject->Target,
  1026.                                  intel_image->base.Base.TexFormat,
  1027.                                  intel_image->base.Base.Level,
  1028.                                  intel_image->base.Base.Level,
  1029.                                  width, height, depth,
  1030.                                  true,
  1031.                                  irb->mt->num_samples,
  1032.                                  INTEL_MIPTREE_TILING_ANY,
  1033.                                  false);
  1034.  
  1035.    if (intel_miptree_wants_hiz_buffer(brw, new_mt)) {
  1036.       intel_miptree_alloc_hiz(brw, new_mt);
  1037.    }
  1038.  
  1039.    intel_miptree_copy_teximage(brw, intel_image, new_mt, invalidate);
  1040.  
  1041.    intel_miptree_reference(&irb->mt, intel_image->mt);
  1042.    intel_renderbuffer_set_draw_offset(irb);
  1043.    intel_miptree_release(&new_mt);
  1044. }
  1045.  
  1046. void
  1047. brw_render_cache_set_clear(struct brw_context *brw)
  1048. {
  1049.    struct set_entry *entry;
  1050.  
  1051.    set_foreach(brw->render_cache, entry) {
  1052.       _mesa_set_remove(brw->render_cache, entry);
  1053.    }
  1054. }
  1055.  
  1056. void
  1057. brw_render_cache_set_add_bo(struct brw_context *brw, drm_intel_bo *bo)
  1058. {
  1059.    _mesa_set_add(brw->render_cache, bo);
  1060. }
  1061.  
  1062. /**
  1063.  * Emits an appropriate flush for a BO if it has been rendered to within the
  1064.  * same batchbuffer as a read that's about to be emitted.
  1065.  *
  1066.  * The GPU has separate, incoherent caches for the render cache and the
  1067.  * sampler cache, along with other caches.  Usually data in the different
  1068.  * caches don't interact (e.g. we don't render to our driver-generated
  1069.  * immediate constant data), but for render-to-texture in FBOs we definitely
  1070.  * do.  When a batchbuffer is flushed, the kernel will ensure that everything
  1071.  * necessary is flushed before another use of that BO, but for reuse from
  1072.  * different caches within a batchbuffer, it's all our responsibility.
  1073.  */
  1074. void
  1075. brw_render_cache_set_check_flush(struct brw_context *brw, drm_intel_bo *bo)
  1076. {
  1077.    if (!_mesa_set_search(brw->render_cache, bo))
  1078.       return;
  1079.  
  1080.    intel_batchbuffer_emit_mi_flush(brw);
  1081. }
  1082.  
  1083. /**
  1084.  * Do one-time context initializations related to GL_EXT_framebuffer_object.
  1085.  * Hook in device driver functions.
  1086.  */
  1087. void
  1088. intel_fbo_init(struct brw_context *brw)
  1089. {
  1090.    struct dd_function_table *dd = &brw->ctx.Driver;
  1091.    dd->NewFramebuffer = intel_new_framebuffer;
  1092.    dd->NewRenderbuffer = intel_new_renderbuffer;
  1093.    dd->MapRenderbuffer = intel_map_renderbuffer;
  1094.    dd->UnmapRenderbuffer = intel_unmap_renderbuffer;
  1095.    dd->RenderTexture = intel_render_texture;
  1096.    dd->ValidateFramebuffer = intel_validate_framebuffer;
  1097.    if (brw->gen >= 6)
  1098.       dd->BlitFramebuffer = intel_blit_framebuffer;
  1099.    else
  1100.       dd->BlitFramebuffer = gen4_blit_framebuffer;
  1101.    dd->EGLImageTargetRenderbufferStorage =
  1102.       intel_image_target_renderbuffer_storage;
  1103.  
  1104.    brw->render_cache = _mesa_set_create(brw, _mesa_hash_pointer,
  1105.                                         _mesa_key_pointer_equal);
  1106. }
  1107.