Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tr_screen.c 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. /**************************************************************************
  2. *
  3. * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
  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 TUNGSTEN GRAPHICS 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. #include "util/u_format.h"
  28. #include "util/u_memory.h"
  29. #include "util/u_simple_list.h"
  30. #include "tr_dump.h"
  31. #include "tr_dump_state.h"
  32. #include "tr_texture.h"
  33. #include "tr_context.h"
  34. #include "tr_screen.h"
  35. #include "tr_public.h"
  36. #include "pipe/p_format.h"
  37. static boolean trace = FALSE;
  38. static const char *
  39. trace_screen_get_name(struct pipe_screen *_screen)
  40. {
  41. struct trace_screen *tr_scr = trace_screen(_screen);
  42. struct pipe_screen *screen = tr_scr->screen;
  43. const char *result;
  44. trace_dump_call_begin("pipe_screen", "get_name");
  45. trace_dump_arg(ptr, screen);
  46. result = screen->get_name(screen);
  47. trace_dump_ret(string, result);
  48. trace_dump_call_end();
  49. return result;
  50. }
  51. static const char *
  52. trace_screen_get_vendor(struct pipe_screen *_screen)
  53. {
  54. struct trace_screen *tr_scr = trace_screen(_screen);
  55. struct pipe_screen *screen = tr_scr->screen;
  56. const char *result;
  57. trace_dump_call_begin("pipe_screen", "get_vendor");
  58. trace_dump_arg(ptr, screen);
  59. result = screen->get_vendor(screen);
  60. trace_dump_ret(string, result);
  61. trace_dump_call_end();
  62. return result;
  63. }
  64. static int
  65. trace_screen_get_param(struct pipe_screen *_screen,
  66. enum pipe_cap param)
  67. {
  68. struct trace_screen *tr_scr = trace_screen(_screen);
  69. struct pipe_screen *screen = tr_scr->screen;
  70. int result;
  71. trace_dump_call_begin("pipe_screen", "get_param");
  72. trace_dump_arg(ptr, screen);
  73. trace_dump_arg(int, param);
  74. result = screen->get_param(screen, param);
  75. trace_dump_ret(int, result);
  76. trace_dump_call_end();
  77. return result;
  78. }
  79. static int
  80. trace_screen_get_shader_param(struct pipe_screen *_screen, unsigned shader,
  81. enum pipe_shader_cap param)
  82. {
  83. struct trace_screen *tr_scr = trace_screen(_screen);
  84. struct pipe_screen *screen = tr_scr->screen;
  85. int result;
  86. trace_dump_call_begin("pipe_screen", "get_shader_param");
  87. trace_dump_arg(ptr, screen);
  88. trace_dump_arg(int, shader);
  89. trace_dump_arg(int, param);
  90. result = screen->get_shader_param(screen, shader, param);
  91. trace_dump_ret(int, result);
  92. trace_dump_call_end();
  93. return result;
  94. }
  95. static float
  96. trace_screen_get_paramf(struct pipe_screen *_screen,
  97. enum pipe_cap param)
  98. {
  99. struct trace_screen *tr_scr = trace_screen(_screen);
  100. struct pipe_screen *screen = tr_scr->screen;
  101. float result;
  102. trace_dump_call_begin("pipe_screen", "get_paramf");
  103. trace_dump_arg(ptr, screen);
  104. trace_dump_arg(int, param);
  105. result = screen->get_paramf(screen, param);
  106. trace_dump_ret(float, result);
  107. trace_dump_call_end();
  108. return result;
  109. }
  110. static boolean
  111. trace_screen_is_format_supported(struct pipe_screen *_screen,
  112. enum pipe_format format,
  113. enum pipe_texture_target target,
  114. unsigned sample_count,
  115. unsigned tex_usage,
  116. unsigned geom_flags)
  117. {
  118. struct trace_screen *tr_scr = trace_screen(_screen);
  119. struct pipe_screen *screen = tr_scr->screen;
  120. boolean result;
  121. trace_dump_call_begin("pipe_screen", "is_format_supported");
  122. trace_dump_arg(ptr, screen);
  123. trace_dump_arg(format, format);
  124. trace_dump_arg(int, target);
  125. trace_dump_arg(uint, sample_count);
  126. trace_dump_arg(uint, tex_usage);
  127. trace_dump_arg(uint, geom_flags);
  128. result = screen->is_format_supported(screen, format, target, sample_count,
  129. tex_usage, geom_flags);
  130. trace_dump_ret(bool, result);
  131. trace_dump_call_end();
  132. return result;
  133. }
  134. static struct pipe_context *
  135. trace_screen_context_create(struct pipe_screen *_screen, void *priv)
  136. {
  137. struct trace_screen *tr_scr = trace_screen(_screen);
  138. struct pipe_screen *screen = tr_scr->screen;
  139. struct pipe_context *result;
  140. trace_dump_call_begin("pipe_screen", "context_create");
  141. trace_dump_arg(ptr, screen);
  142. result = screen->context_create(screen, priv);
  143. trace_dump_ret(ptr, result);
  144. trace_dump_call_end();
  145. result = trace_context_create(tr_scr, result);
  146. return result;
  147. }
  148. static void
  149. trace_screen_flush_frontbuffer(struct pipe_screen *_screen,
  150. struct pipe_resource *_resource,
  151. unsigned level, unsigned layer,
  152. void *context_private)
  153. {
  154. struct trace_screen *tr_scr = trace_screen(_screen);
  155. struct trace_resource *tr_res = trace_resource(_resource);
  156. struct pipe_screen *screen = tr_scr->screen;
  157. struct pipe_resource *resource = tr_res->resource;
  158. trace_dump_call_begin("pipe_screen", "flush_frontbuffer");
  159. trace_dump_arg(ptr, screen);
  160. trace_dump_arg(ptr, resource);
  161. trace_dump_arg(uint, level);
  162. trace_dump_arg(uint, layer);
  163. /* XXX: hide, as there is nothing we can do with this
  164. trace_dump_arg(ptr, context_private);
  165. */
  166. screen->flush_frontbuffer(screen, resource, level, layer, context_private);
  167. trace_dump_call_end();
  168. }
  169. /********************************************************************
  170. * texture
  171. */
  172. static struct pipe_resource *
  173. trace_screen_resource_create(struct pipe_screen *_screen,
  174. const struct pipe_resource *templat)
  175. {
  176. struct trace_screen *tr_scr = trace_screen(_screen);
  177. struct pipe_screen *screen = tr_scr->screen;
  178. struct pipe_resource *result;
  179. trace_dump_call_begin("pipe_screen", "resource_create");
  180. trace_dump_arg(ptr, screen);
  181. trace_dump_arg(resource_template, templat);
  182. result = screen->resource_create(screen, templat);
  183. trace_dump_ret(ptr, result);
  184. trace_dump_call_end();
  185. result = trace_resource_create(tr_scr, result);
  186. return result;
  187. }
  188. static struct pipe_resource *
  189. trace_screen_resource_from_handle(struct pipe_screen *_screen,
  190. const struct pipe_resource *templ,
  191. struct winsys_handle *handle)
  192. {
  193. struct trace_screen *tr_screen = trace_screen(_screen);
  194. struct pipe_screen *screen = tr_screen->screen;
  195. struct pipe_resource *result;
  196. /* TODO trace call */
  197. result = screen->resource_from_handle(screen, templ, handle);
  198. result = trace_resource_create(trace_screen(_screen), result);
  199. return result;
  200. }
  201. static boolean
  202. trace_screen_resource_get_handle(struct pipe_screen *_screen,
  203. struct pipe_resource *_texture,
  204. struct winsys_handle *handle)
  205. {
  206. struct trace_screen *tr_screen = trace_screen(_screen);
  207. struct trace_resource *tr_texture = trace_resource(_texture);
  208. struct pipe_screen *screen = tr_screen->screen;
  209. struct pipe_resource *texture = tr_texture->resource;
  210. /* TODO trace call */
  211. return screen->resource_get_handle(screen, texture, handle);
  212. }
  213. static void
  214. trace_screen_resource_destroy(struct pipe_screen *_screen,
  215. struct pipe_resource *_texture)
  216. {
  217. struct trace_screen *tr_scr = trace_screen(_screen);
  218. struct trace_resource *tr_tex = trace_resource(_texture);
  219. struct pipe_screen *screen = tr_scr->screen;
  220. struct pipe_resource *texture = tr_tex->resource;
  221. assert(texture->screen == screen);
  222. trace_dump_call_begin("pipe_screen", "texture_destroy");
  223. trace_dump_arg(ptr, screen);
  224. trace_dump_arg(ptr, texture);
  225. trace_dump_call_end();
  226. trace_resource_destroy(tr_scr, tr_tex);
  227. }
  228. /********************************************************************
  229. * buffer
  230. */
  231. static struct pipe_resource *
  232. trace_screen_user_buffer_create(struct pipe_screen *_screen,
  233. void *data,
  234. unsigned size,
  235. unsigned usage)
  236. {
  237. struct trace_screen *tr_scr = trace_screen(_screen);
  238. struct pipe_screen *screen = tr_scr->screen;
  239. struct pipe_resource *result;
  240. trace_dump_call_begin("pipe_screen", "user_buffer_create");
  241. trace_dump_arg(ptr, screen);
  242. trace_dump_arg_begin("data");
  243. trace_dump_bytes(data, size);
  244. trace_dump_arg_end();
  245. trace_dump_arg(uint, size);
  246. trace_dump_arg(uint, usage);
  247. result = screen->user_buffer_create(screen, data, size, usage);
  248. trace_dump_ret(ptr, result);
  249. trace_dump_call_end();
  250. if(result) {
  251. assert(!(result->flags & TRACE_FLAG_USER_BUFFER));
  252. result->flags |= TRACE_FLAG_USER_BUFFER;
  253. }
  254. return trace_resource_create(tr_scr, result);
  255. }
  256. /********************************************************************
  257. * fence
  258. */
  259. static void
  260. trace_screen_fence_reference(struct pipe_screen *_screen,
  261. struct pipe_fence_handle **pdst,
  262. struct pipe_fence_handle *src)
  263. {
  264. struct trace_screen *tr_scr = trace_screen(_screen);
  265. struct pipe_screen *screen = tr_scr->screen;
  266. struct pipe_fence_handle *dst;
  267. assert(pdst);
  268. dst = *pdst;
  269. trace_dump_call_begin("pipe_screen", "fence_reference");
  270. trace_dump_arg(ptr, screen);
  271. trace_dump_arg(ptr, dst);
  272. trace_dump_arg(ptr, src);
  273. screen->fence_reference(screen, pdst, src);
  274. trace_dump_call_end();
  275. }
  276. static boolean
  277. trace_screen_fence_signalled(struct pipe_screen *_screen,
  278. struct pipe_fence_handle *fence)
  279. {
  280. struct trace_screen *tr_scr = trace_screen(_screen);
  281. struct pipe_screen *screen = tr_scr->screen;
  282. int result;
  283. trace_dump_call_begin("pipe_screen", "fence_signalled");
  284. trace_dump_arg(ptr, screen);
  285. trace_dump_arg(ptr, fence);
  286. result = screen->fence_signalled(screen, fence);
  287. trace_dump_ret(bool, result);
  288. trace_dump_call_end();
  289. return result;
  290. }
  291. static boolean
  292. trace_screen_fence_finish(struct pipe_screen *_screen,
  293. struct pipe_fence_handle *fence,
  294. uint64_t timeout)
  295. {
  296. struct trace_screen *tr_scr = trace_screen(_screen);
  297. struct pipe_screen *screen = tr_scr->screen;
  298. int result;
  299. trace_dump_call_begin("pipe_screen", "fence_finish");
  300. trace_dump_arg(ptr, screen);
  301. trace_dump_arg(ptr, fence);
  302. trace_dump_arg(uint, timeout);
  303. result = screen->fence_finish(screen, fence, timeout);
  304. trace_dump_ret(bool, result);
  305. trace_dump_call_end();
  306. return result;
  307. }
  308. /********************************************************************
  309. * screen
  310. */
  311. static void
  312. trace_screen_destroy(struct pipe_screen *_screen)
  313. {
  314. struct trace_screen *tr_scr = trace_screen(_screen);
  315. struct pipe_screen *screen = tr_scr->screen;
  316. trace_dump_call_begin("pipe_screen", "destroy");
  317. trace_dump_arg(ptr, screen);
  318. trace_dump_call_end();
  319. trace_dump_trace_end();
  320. screen->destroy(screen);
  321. FREE(tr_scr);
  322. }
  323. boolean
  324. trace_enabled(void)
  325. {
  326. static boolean firstrun = TRUE;
  327. if (!firstrun)
  328. return trace;
  329. firstrun = FALSE;
  330. if(trace_dump_trace_begin()) {
  331. trace_dumping_start();
  332. trace = TRUE;
  333. }
  334. return trace;
  335. }
  336. struct pipe_screen *
  337. trace_screen_create(struct pipe_screen *screen)
  338. {
  339. struct trace_screen *tr_scr;
  340. struct pipe_winsys *winsys;
  341. if(!screen)
  342. goto error1;
  343. if (!trace_enabled())
  344. goto error1;
  345. trace_dump_call_begin("", "pipe_screen_create");
  346. tr_scr = CALLOC_STRUCT(trace_screen);
  347. if(!tr_scr)
  348. goto error2;
  349. #if 0
  350. winsys = trace_winsys_create(screen->winsys);
  351. if(!winsys)
  352. goto error3;
  353. #else
  354. winsys = screen->winsys;
  355. #endif
  356. tr_scr->base.winsys = winsys;
  357. tr_scr->base.destroy = trace_screen_destroy;
  358. tr_scr->base.get_name = trace_screen_get_name;
  359. tr_scr->base.get_vendor = trace_screen_get_vendor;
  360. tr_scr->base.get_param = trace_screen_get_param;
  361. tr_scr->base.get_shader_param = trace_screen_get_shader_param;
  362. tr_scr->base.get_paramf = trace_screen_get_paramf;
  363. tr_scr->base.is_format_supported = trace_screen_is_format_supported;
  364. assert(screen->context_create);
  365. tr_scr->base.context_create = trace_screen_context_create;
  366. tr_scr->base.resource_create = trace_screen_resource_create;
  367. tr_scr->base.resource_from_handle = trace_screen_resource_from_handle;
  368. tr_scr->base.resource_get_handle = trace_screen_resource_get_handle;
  369. tr_scr->base.resource_destroy = trace_screen_resource_destroy;
  370. tr_scr->base.user_buffer_create = trace_screen_user_buffer_create;
  371. tr_scr->base.fence_reference = trace_screen_fence_reference;
  372. tr_scr->base.fence_signalled = trace_screen_fence_signalled;
  373. tr_scr->base.fence_finish = trace_screen_fence_finish;
  374. tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer;
  375. tr_scr->screen = screen;
  376. trace_dump_ret(ptr, screen);
  377. trace_dump_call_end();
  378. return &tr_scr->base;
  379. error2:
  380. trace_dump_ret(ptr, screen);
  381. trace_dump_call_end();
  382. trace_dump_trace_end();
  383. error1:
  384. return screen;
  385. }
  386. struct trace_screen *
  387. trace_screen(struct pipe_screen *screen)
  388. {
  389. assert(screen);
  390. assert(screen->destroy == trace_screen_destroy);
  391. return (struct trace_screen *)screen;
  392. }