Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2010 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21.  * IN THE SOFTWARE.
  22.  */
  23.  
  24. /**
  25.  * @file brw_object_purgeable.c
  26.  *
  27.  * The driver implementation of the GL_APPLE_object_purgeable extension.
  28.  */
  29.  
  30. #include "main/imports.h"
  31. #include "main/mtypes.h"
  32. #include "main/macros.h"
  33. #include "main/bufferobj.h"
  34.  
  35. #include "brw_context.h"
  36. #include "intel_buffer_objects.h"
  37. #include "intel_fbo.h"
  38. #include "intel_mipmap_tree.h"
  39.  
  40. static GLenum
  41. intel_buffer_purgeable(drm_intel_bo *buffer)
  42. {
  43.    int retained = 0;
  44.  
  45.    if (buffer != NULL)
  46.       retained = drm_intel_bo_madvise(buffer, I915_MADV_DONTNEED);
  47.  
  48.    return retained ? GL_VOLATILE_APPLE : GL_RELEASED_APPLE;
  49. }
  50.  
  51. static GLenum
  52. intel_buffer_object_purgeable(struct gl_context * ctx,
  53.                               struct gl_buffer_object *obj,
  54.                               GLenum option)
  55. {
  56.    struct intel_buffer_object *intel_obj = intel_buffer_object(obj);
  57.  
  58.    if (intel_obj->buffer != NULL)
  59.       return intel_buffer_purgeable(intel_obj->buffer);
  60.  
  61.    if (option == GL_RELEASED_APPLE) {
  62.       return GL_RELEASED_APPLE;
  63.    } else {
  64.       /* XXX Create the buffer and madvise(MADV_DONTNEED)? */
  65.       return intel_buffer_purgeable(intel_obj->buffer);
  66.    }
  67. }
  68.  
  69. static GLenum
  70. intel_texture_object_purgeable(struct gl_context * ctx,
  71.                                struct gl_texture_object *obj,
  72.                                GLenum option)
  73. {
  74.    struct intel_texture_object *intel;
  75.  
  76.    (void) ctx;
  77.    (void) option;
  78.  
  79.    intel = intel_texture_object(obj);
  80.    if (intel->mt == NULL || intel->mt->bo == NULL)
  81.       return GL_RELEASED_APPLE;
  82.  
  83.    return intel_buffer_purgeable(intel->mt->bo);
  84. }
  85.  
  86. static GLenum
  87. intel_render_object_purgeable(struct gl_context * ctx,
  88.                               struct gl_renderbuffer *obj,
  89.                               GLenum option)
  90. {
  91.    struct intel_renderbuffer *intel;
  92.  
  93.    (void) ctx;
  94.    (void) option;
  95.  
  96.    intel = intel_renderbuffer(obj);
  97.    if (intel->mt == NULL)
  98.       return GL_RELEASED_APPLE;
  99.  
  100.    return intel_buffer_purgeable(intel->mt->bo);
  101. }
  102.  
  103. static GLenum
  104. intel_buffer_unpurgeable(drm_intel_bo *buffer)
  105. {
  106.    int retained;
  107.  
  108.    retained = 0;
  109.    if (buffer != NULL)
  110.       retained = drm_intel_bo_madvise(buffer, I915_MADV_WILLNEED);
  111.  
  112.    return retained ? GL_RETAINED_APPLE : GL_UNDEFINED_APPLE;
  113. }
  114.  
  115. static GLenum
  116. intel_buffer_object_unpurgeable(struct gl_context * ctx,
  117.                                 struct gl_buffer_object *obj,
  118.                                 GLenum option)
  119. {
  120.    (void) ctx;
  121.    (void) option;
  122.  
  123.    return intel_buffer_unpurgeable(intel_buffer_object(obj)->buffer);
  124. }
  125.  
  126. static GLenum
  127. intel_texture_object_unpurgeable(struct gl_context * ctx,
  128.                                  struct gl_texture_object *obj,
  129.                                  GLenum option)
  130. {
  131.    struct intel_texture_object *intel;
  132.  
  133.    (void) ctx;
  134.    (void) option;
  135.  
  136.    intel = intel_texture_object(obj);
  137.    if (intel->mt == NULL || intel->mt->bo == NULL)
  138.       return GL_UNDEFINED_APPLE;
  139.  
  140.    return intel_buffer_unpurgeable(intel->mt->bo);
  141. }
  142.  
  143. static GLenum
  144. intel_render_object_unpurgeable(struct gl_context * ctx,
  145.                                 struct gl_renderbuffer *obj,
  146.                                 GLenum option)
  147. {
  148.    struct intel_renderbuffer *intel;
  149.  
  150.    (void) ctx;
  151.    (void) option;
  152.  
  153.    intel = intel_renderbuffer(obj);
  154.    if (intel->mt == NULL)
  155.       return GL_UNDEFINED_APPLE;
  156.  
  157.    return intel_buffer_unpurgeable(intel->mt->bo);
  158. }
  159.  
  160. void
  161. brw_init_object_purgeable_functions(struct dd_function_table *functions)
  162. {
  163.    functions->BufferObjectPurgeable = intel_buffer_object_purgeable;
  164.    functions->TextureObjectPurgeable = intel_texture_object_purgeable;
  165.    functions->RenderObjectPurgeable = intel_render_object_purgeable;
  166.  
  167.    functions->BufferObjectUnpurgeable = intel_buffer_object_unpurgeable;
  168.    functions->TextureObjectUnpurgeable = intel_texture_object_unpurgeable;
  169.    functions->RenderObjectUnpurgeable = intel_render_object_unpurgeable;
  170. }
  171.