Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2010 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 "pipe/p_screen.h"
  30. #include "pipe/p_state.h"
  31. #include "util/u_memory.h"
  32. #include "util/u_debug.h"
  33. #include "util/simple_list.h"
  34.  
  35. #include "rbug_public.h"
  36. #include "rbug_screen.h"
  37. #include "rbug_context.h"
  38. #include "rbug_objects.h"
  39.  
  40. DEBUG_GET_ONCE_BOOL_OPTION(rbug, "GALLIUM_RBUG", FALSE)
  41.  
  42. static void
  43. rbug_screen_destroy(struct pipe_screen *_screen)
  44. {
  45.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  46.    struct pipe_screen *screen = rb_screen->screen;
  47.  
  48.    screen->destroy(screen);
  49.  
  50.    FREE(rb_screen);
  51. }
  52.  
  53. static const char *
  54. rbug_screen_get_name(struct pipe_screen *_screen)
  55. {
  56.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  57.    struct pipe_screen *screen = rb_screen->screen;
  58.  
  59.    return screen->get_name(screen);
  60. }
  61.  
  62. static const char *
  63. rbug_screen_get_vendor(struct pipe_screen *_screen)
  64. {
  65.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  66.    struct pipe_screen *screen = rb_screen->screen;
  67.  
  68.    return screen->get_vendor(screen);
  69. }
  70.  
  71. static const char *
  72. rbug_screen_get_device_vendor(struct pipe_screen *_screen)
  73. {
  74.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  75.    struct pipe_screen *screen = rb_screen->screen;
  76.  
  77.    return screen->get_device_vendor(screen);
  78. }
  79.  
  80. static int
  81. rbug_screen_get_param(struct pipe_screen *_screen,
  82.                       enum pipe_cap param)
  83. {
  84.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  85.    struct pipe_screen *screen = rb_screen->screen;
  86.  
  87.    return screen->get_param(screen,
  88.                             param);
  89. }
  90.  
  91. static int
  92. rbug_screen_get_shader_param(struct pipe_screen *_screen,
  93.                       unsigned shader, enum pipe_shader_cap param)
  94. {
  95.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  96.    struct pipe_screen *screen = rb_screen->screen;
  97.  
  98.    return screen->get_shader_param(screen, shader,
  99.                             param);
  100. }
  101.  
  102. static float
  103. rbug_screen_get_paramf(struct pipe_screen *_screen,
  104.                        enum pipe_capf param)
  105. {
  106.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  107.    struct pipe_screen *screen = rb_screen->screen;
  108.  
  109.    return screen->get_paramf(screen,
  110.                              param);
  111. }
  112.  
  113. static boolean
  114. rbug_screen_is_format_supported(struct pipe_screen *_screen,
  115.                                 enum pipe_format format,
  116.                                 enum pipe_texture_target target,
  117.                                 unsigned sample_count,
  118.                                 unsigned tex_usage)
  119. {
  120.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  121.    struct pipe_screen *screen = rb_screen->screen;
  122.  
  123.    return screen->is_format_supported(screen,
  124.                                       format,
  125.                                       target,
  126.                                       sample_count,
  127.                                       tex_usage);
  128. }
  129.  
  130. static struct pipe_context *
  131. rbug_screen_context_create(struct pipe_screen *_screen,
  132.                            void *priv)
  133. {
  134.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  135.    struct pipe_screen *screen = rb_screen->screen;
  136.    struct pipe_context *result;
  137.  
  138.    result = screen->context_create(screen, priv);
  139.    if (result)
  140.       return rbug_context_create(_screen, result);
  141.    return NULL;
  142. }
  143.  
  144. static struct pipe_resource *
  145. rbug_screen_resource_create(struct pipe_screen *_screen,
  146.                             const struct pipe_resource *templat)
  147. {
  148.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  149.    struct pipe_screen *screen = rb_screen->screen;
  150.    struct pipe_resource *result;
  151.  
  152.    result = screen->resource_create(screen,
  153.                                     templat);
  154.  
  155.    if (result)
  156.       return rbug_resource_create(rb_screen, result);
  157.    return NULL;
  158. }
  159.  
  160. static struct pipe_resource *
  161. rbug_screen_resource_from_handle(struct pipe_screen *_screen,
  162.                                  const struct pipe_resource *templ,
  163.                                  struct winsys_handle *handle)
  164. {
  165.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  166.    struct pipe_screen *screen = rb_screen->screen;
  167.    struct pipe_resource *result;
  168.  
  169.    result = screen->resource_from_handle(screen, templ, handle);
  170.  
  171.    result = rbug_resource_create(rbug_screen(_screen), result);
  172.  
  173.    return result;
  174. }
  175.  
  176. static boolean
  177. rbug_screen_resource_get_handle(struct pipe_screen *_screen,
  178.                                 struct pipe_resource *_resource,
  179.                                 struct winsys_handle *handle)
  180. {
  181.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  182.    struct rbug_resource *rb_resource = rbug_resource(_resource);
  183.    struct pipe_screen *screen = rb_screen->screen;
  184.    struct pipe_resource *resource = rb_resource->resource;
  185.  
  186.    return screen->resource_get_handle(screen, resource, handle);
  187. }
  188.  
  189.  
  190.  
  191. static void
  192. rbug_screen_resource_destroy(struct pipe_screen *screen,
  193.                              struct pipe_resource *_resource)
  194. {
  195.    rbug_resource_destroy(rbug_resource(_resource));
  196. }
  197.  
  198. static void
  199. rbug_screen_flush_frontbuffer(struct pipe_screen *_screen,
  200.                               struct pipe_resource *_resource,
  201.                               unsigned level, unsigned layer,
  202.                               void *context_private, struct pipe_box *sub_box)
  203. {
  204.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  205.    struct rbug_resource *rb_resource = rbug_resource(_resource);
  206.    struct pipe_screen *screen = rb_screen->screen;
  207.    struct pipe_resource *resource = rb_resource->resource;
  208.  
  209.    screen->flush_frontbuffer(screen,
  210.                              resource,
  211.                              level, layer,
  212.                              context_private, sub_box);
  213. }
  214.  
  215. static void
  216. rbug_screen_fence_reference(struct pipe_screen *_screen,
  217.                             struct pipe_fence_handle **ptr,
  218.                             struct pipe_fence_handle *fence)
  219. {
  220.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  221.    struct pipe_screen *screen = rb_screen->screen;
  222.  
  223.    screen->fence_reference(screen,
  224.                            ptr,
  225.                            fence);
  226. }
  227.  
  228. static boolean
  229. rbug_screen_fence_signalled(struct pipe_screen *_screen,
  230.                             struct pipe_fence_handle *fence)
  231. {
  232.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  233.    struct pipe_screen *screen = rb_screen->screen;
  234.  
  235.    return screen->fence_signalled(screen,
  236.                                   fence);
  237. }
  238.  
  239. static boolean
  240. rbug_screen_fence_finish(struct pipe_screen *_screen,
  241.                          struct pipe_fence_handle *fence,
  242.                          uint64_t timeout)
  243. {
  244.    struct rbug_screen *rb_screen = rbug_screen(_screen);
  245.    struct pipe_screen *screen = rb_screen->screen;
  246.  
  247.    return screen->fence_finish(screen,
  248.                                fence,
  249.                                timeout);
  250. }
  251.  
  252. boolean
  253. rbug_enabled()
  254. {
  255.    return debug_get_option_rbug();
  256. }
  257.  
  258. struct pipe_screen *
  259. rbug_screen_create(struct pipe_screen *screen)
  260. {
  261.    struct rbug_screen *rb_screen;
  262.  
  263.    if (!debug_get_option_rbug())
  264.       return screen;
  265.  
  266.    rb_screen = CALLOC_STRUCT(rbug_screen);
  267.    if (!rb_screen)
  268.       return screen;
  269.  
  270.    pipe_mutex_init(rb_screen->list_mutex);
  271.    make_empty_list(&rb_screen->contexts);
  272.    make_empty_list(&rb_screen->resources);
  273.    make_empty_list(&rb_screen->surfaces);
  274.    make_empty_list(&rb_screen->transfers);
  275.  
  276.    rb_screen->base.destroy = rbug_screen_destroy;
  277.    rb_screen->base.get_name = rbug_screen_get_name;
  278.    rb_screen->base.get_vendor = rbug_screen_get_vendor;
  279.    rb_screen->base.get_device_vendor = rbug_screen_get_device_vendor;
  280.    rb_screen->base.get_param = rbug_screen_get_param;
  281.    rb_screen->base.get_shader_param = rbug_screen_get_shader_param;
  282.    rb_screen->base.get_paramf = rbug_screen_get_paramf;
  283.    rb_screen->base.is_format_supported = rbug_screen_is_format_supported;
  284.    rb_screen->base.context_create = rbug_screen_context_create;
  285.    rb_screen->base.resource_create = rbug_screen_resource_create;
  286.    rb_screen->base.resource_from_handle = rbug_screen_resource_from_handle;
  287.    rb_screen->base.resource_get_handle = rbug_screen_resource_get_handle;
  288.    rb_screen->base.resource_destroy = rbug_screen_resource_destroy;
  289.    rb_screen->base.flush_frontbuffer = rbug_screen_flush_frontbuffer;
  290.    rb_screen->base.fence_reference = rbug_screen_fence_reference;
  291.    rb_screen->base.fence_signalled = rbug_screen_fence_signalled;
  292.    rb_screen->base.fence_finish = rbug_screen_fence_finish;
  293.  
  294.    rb_screen->screen = screen;
  295.  
  296.    rb_screen->private_context = screen->context_create(screen, NULL);
  297.    if (!rb_screen->private_context)
  298.       goto err_free;
  299.  
  300.    rb_screen->rbug = rbug_start(rb_screen);
  301.  
  302.    if (!rb_screen->rbug)
  303.       goto err_context;
  304.  
  305.    return &rb_screen->base;
  306.  
  307. err_context:
  308.    rb_screen->private_context->destroy(rb_screen->private_context);
  309. err_free:
  310.    FREE(rb_screen);
  311.    return screen;
  312. }
  313.