1#include "dri_query_renderer.h"
2
3#include "util/u_inlines.h"
4#include "state_tracker/drm_driver.h"
5
6#include "utils.h"
7#include "dri_screen.h"
8#include "dri_query_renderer.h"
9
10static int
11dri2_query_renderer_integer(__DRIscreen *_screen, int param,
12                            unsigned int *value)
13{
14   struct dri_screen *screen = dri_screen(_screen);
15
16   switch (param) {
17   case __DRI2_RENDERER_VENDOR_ID:
18      value[0] =
19         (unsigned int)screen->base.screen->get_param(screen->base.screen,
20                                                      PIPE_CAP_VENDOR_ID);
21      return 0;
22   case __DRI2_RENDERER_DEVICE_ID:
23      value[0] =
24         (unsigned int)screen->base.screen->get_param(screen->base.screen,
25                                                      PIPE_CAP_DEVICE_ID);
26      return 0;
27   case __DRI2_RENDERER_ACCELERATED:
28      value[0] =
29         (unsigned int)screen->base.screen->get_param(screen->base.screen,
30                                                      PIPE_CAP_ACCELERATED);
31      return 0;
32
33   case __DRI2_RENDERER_VIDEO_MEMORY:
34      value[0] =
35         (unsigned int)screen->base.screen->get_param(screen->base.screen,
36                                                      PIPE_CAP_VIDEO_MEMORY);
37      return 0;
38
39   case __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE:
40      value[0] =
41         (unsigned int)screen->base.screen->get_param(screen->base.screen,
42                                                      PIPE_CAP_UMA);
43      return 0;
44
45   case __DRI2_RENDERER_HAS_TEXTURE_3D:
46      value[0] =
47         screen->base.screen->get_param(screen->base.screen,
48                                        PIPE_CAP_MAX_TEXTURE_3D_LEVELS) != 0;
49      return 0;
50
51   case __DRI2_RENDERER_HAS_FRAMEBUFFER_SRGB:
52      value[0] =
53         screen->base.screen->is_format_supported(screen->base.screen,
54                                                  PIPE_FORMAT_B8G8R8A8_SRGB,
55                                                  PIPE_TEXTURE_2D, 0, 0,
56                                                  PIPE_BIND_RENDER_TARGET);
57      return 0;
58   case __DRI2_RENDERER_HAS_CONTEXT_PRIORITY:
59      value[0] =
60         screen->base.screen->get_param(screen->base.screen,
61                                        PIPE_CAP_CONTEXT_PRIORITY_MASK);
62      if (!value[0])
63         return -1;
64      return 0;
65   default:
66      return driQueryRendererIntegerCommon(_screen, param, value);
67   }
68}
69
70static int
71dri2_query_renderer_string(__DRIscreen *_screen, int param,
72                           const char **value)
73{
74   struct dri_screen *screen = dri_screen(_screen);
75
76   switch (param) {
77   case __DRI2_RENDERER_VENDOR_ID:
78      value[0] = screen->base.screen->get_vendor(screen->base.screen);
79      return 0;
80   case __DRI2_RENDERER_DEVICE_ID:
81      value[0] = screen->base.screen->get_name(screen->base.screen);
82      return 0;
83   default:
84      return -1;
85   }
86}
87
88const __DRI2rendererQueryExtension dri2RendererQueryExtension = {
89    .base = { __DRI2_RENDERER_QUERY, 1 },
90
91    .queryInteger         = dri2_query_renderer_integer,
92    .queryString          = dri2_query_renderer_string
93};
94