Clone of mesa.
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. /**************************************************************************
  2. *
  3. * Copyright 2009 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. #include "pipe/p_context.h"
  28. #include "util/u_memory.h"
  29. #include "util/u_inlines.h"
  30. #include "id_context.h"
  31. #include "id_objects.h"
  32. static void
  33. identity_destroy(struct pipe_context *_pipe)
  34. {
  35. struct identity_context *id_pipe = identity_context(_pipe);
  36. struct pipe_context *pipe = id_pipe->pipe;
  37. pipe->destroy(pipe);
  38. FREE(id_pipe);
  39. }
  40. static void
  41. identity_draw_arrays(struct pipe_context *_pipe,
  42. unsigned prim,
  43. unsigned start,
  44. unsigned count)
  45. {
  46. struct identity_context *id_pipe = identity_context(_pipe);
  47. struct pipe_context *pipe = id_pipe->pipe;
  48. pipe->draw_arrays(pipe,
  49. prim,
  50. start,
  51. count);
  52. }
  53. static void
  54. identity_draw_elements(struct pipe_context *_pipe,
  55. struct pipe_resource *_indexResource,
  56. unsigned indexSize,
  57. int indexBias,
  58. unsigned prim,
  59. unsigned start,
  60. unsigned count)
  61. {
  62. struct identity_context *id_pipe = identity_context(_pipe);
  63. struct identity_resource *id_resource = identity_resource(_indexResource);
  64. struct pipe_context *pipe = id_pipe->pipe;
  65. struct pipe_resource *indexResource = id_resource->resource;
  66. pipe->draw_elements(pipe,
  67. indexResource,
  68. indexSize,
  69. indexBias,
  70. prim,
  71. start,
  72. count);
  73. }
  74. static void
  75. identity_draw_range_elements(struct pipe_context *_pipe,
  76. struct pipe_resource *_indexResource,
  77. unsigned indexSize,
  78. int indexBias,
  79. unsigned minIndex,
  80. unsigned maxIndex,
  81. unsigned mode,
  82. unsigned start,
  83. unsigned count)
  84. {
  85. struct identity_context *id_pipe = identity_context(_pipe);
  86. struct identity_resource *id_resource = identity_resource(_indexResource);
  87. struct pipe_context *pipe = id_pipe->pipe;
  88. struct pipe_resource *indexResource = id_resource->resource;
  89. pipe->draw_range_elements(pipe,
  90. indexResource,
  91. indexSize,
  92. indexBias,
  93. minIndex,
  94. maxIndex,
  95. mode,
  96. start,
  97. count);
  98. }
  99. static struct pipe_query *
  100. identity_create_query(struct pipe_context *_pipe,
  101. unsigned query_type)
  102. {
  103. struct identity_context *id_pipe = identity_context(_pipe);
  104. struct pipe_context *pipe = id_pipe->pipe;
  105. return pipe->create_query(pipe,
  106. query_type);
  107. }
  108. static void
  109. identity_destroy_query(struct pipe_context *_pipe,
  110. struct pipe_query *query)
  111. {
  112. struct identity_context *id_pipe = identity_context(_pipe);
  113. struct pipe_context *pipe = id_pipe->pipe;
  114. pipe->destroy_query(pipe,
  115. query);
  116. }
  117. static void
  118. identity_begin_query(struct pipe_context *_pipe,
  119. struct pipe_query *query)
  120. {
  121. struct identity_context *id_pipe = identity_context(_pipe);
  122. struct pipe_context *pipe = id_pipe->pipe;
  123. pipe->begin_query(pipe,
  124. query);
  125. }
  126. static void
  127. identity_end_query(struct pipe_context *_pipe,
  128. struct pipe_query *query)
  129. {
  130. struct identity_context *id_pipe = identity_context(_pipe);
  131. struct pipe_context *pipe = id_pipe->pipe;
  132. pipe->end_query(pipe,
  133. query);
  134. }
  135. static boolean
  136. identity_get_query_result(struct pipe_context *_pipe,
  137. struct pipe_query *query,
  138. boolean wait,
  139. void *result)
  140. {
  141. struct identity_context *id_pipe = identity_context(_pipe);
  142. struct pipe_context *pipe = id_pipe->pipe;
  143. return pipe->get_query_result(pipe,
  144. query,
  145. wait,
  146. result);
  147. }
  148. static void *
  149. identity_create_blend_state(struct pipe_context *_pipe,
  150. const struct pipe_blend_state *blend)
  151. {
  152. struct identity_context *id_pipe = identity_context(_pipe);
  153. struct pipe_context *pipe = id_pipe->pipe;
  154. return pipe->create_blend_state(pipe,
  155. blend);
  156. }
  157. static void
  158. identity_bind_blend_state(struct pipe_context *_pipe,
  159. void *blend)
  160. {
  161. struct identity_context *id_pipe = identity_context(_pipe);
  162. struct pipe_context *pipe = id_pipe->pipe;
  163. pipe->bind_blend_state(pipe,
  164. blend);
  165. }
  166. static void
  167. identity_delete_blend_state(struct pipe_context *_pipe,
  168. void *blend)
  169. {
  170. struct identity_context *id_pipe = identity_context(_pipe);
  171. struct pipe_context *pipe = id_pipe->pipe;
  172. pipe->delete_blend_state(pipe,
  173. blend);
  174. }
  175. static void *
  176. identity_create_sampler_state(struct pipe_context *_pipe,
  177. const struct pipe_sampler_state *sampler)
  178. {
  179. struct identity_context *id_pipe = identity_context(_pipe);
  180. struct pipe_context *pipe = id_pipe->pipe;
  181. return pipe->create_sampler_state(pipe,
  182. sampler);
  183. }
  184. static void
  185. identity_bind_fragment_sampler_states(struct pipe_context *_pipe,
  186. unsigned num_samplers,
  187. void **samplers)
  188. {
  189. struct identity_context *id_pipe = identity_context(_pipe);
  190. struct pipe_context *pipe = id_pipe->pipe;
  191. pipe->bind_fragment_sampler_states(pipe,
  192. num_samplers,
  193. samplers);
  194. }
  195. static void
  196. identity_bind_vertex_sampler_states(struct pipe_context *_pipe,
  197. unsigned num_samplers,
  198. void **samplers)
  199. {
  200. struct identity_context *id_pipe = identity_context(_pipe);
  201. struct pipe_context *pipe = id_pipe->pipe;
  202. pipe->bind_vertex_sampler_states(pipe,
  203. num_samplers,
  204. samplers);
  205. }
  206. static void
  207. identity_delete_sampler_state(struct pipe_context *_pipe,
  208. void *sampler)
  209. {
  210. struct identity_context *id_pipe = identity_context(_pipe);
  211. struct pipe_context *pipe = id_pipe->pipe;
  212. pipe->delete_sampler_state(pipe,
  213. sampler);
  214. }
  215. static void *
  216. identity_create_rasterizer_state(struct pipe_context *_pipe,
  217. const struct pipe_rasterizer_state *rasterizer)
  218. {
  219. struct identity_context *id_pipe = identity_context(_pipe);
  220. struct pipe_context *pipe = id_pipe->pipe;
  221. return pipe->create_rasterizer_state(pipe,
  222. rasterizer);
  223. }
  224. static void
  225. identity_bind_rasterizer_state(struct pipe_context *_pipe,
  226. void *rasterizer)
  227. {
  228. struct identity_context *id_pipe = identity_context(_pipe);
  229. struct pipe_context *pipe = id_pipe->pipe;
  230. pipe->bind_rasterizer_state(pipe,
  231. rasterizer);
  232. }
  233. static void
  234. identity_delete_rasterizer_state(struct pipe_context *_pipe,
  235. void *rasterizer)
  236. {
  237. struct identity_context *id_pipe = identity_context(_pipe);
  238. struct pipe_context *pipe = id_pipe->pipe;
  239. pipe->delete_rasterizer_state(pipe,
  240. rasterizer);
  241. }
  242. static void *
  243. identity_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
  244. const struct pipe_depth_stencil_alpha_state *depth_stencil_alpha)
  245. {
  246. struct identity_context *id_pipe = identity_context(_pipe);
  247. struct pipe_context *pipe = id_pipe->pipe;
  248. return pipe->create_depth_stencil_alpha_state(pipe,
  249. depth_stencil_alpha);
  250. }
  251. static void
  252. identity_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
  253. void *depth_stencil_alpha)
  254. {
  255. struct identity_context *id_pipe = identity_context(_pipe);
  256. struct pipe_context *pipe = id_pipe->pipe;
  257. pipe->bind_depth_stencil_alpha_state(pipe,
  258. depth_stencil_alpha);
  259. }
  260. static void
  261. identity_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
  262. void *depth_stencil_alpha)
  263. {
  264. struct identity_context *id_pipe = identity_context(_pipe);
  265. struct pipe_context *pipe = id_pipe->pipe;
  266. pipe->delete_depth_stencil_alpha_state(pipe,
  267. depth_stencil_alpha);
  268. }
  269. static void *
  270. identity_create_fs_state(struct pipe_context *_pipe,
  271. const struct pipe_shader_state *fs)
  272. {
  273. struct identity_context *id_pipe = identity_context(_pipe);
  274. struct pipe_context *pipe = id_pipe->pipe;
  275. return pipe->create_fs_state(pipe,
  276. fs);
  277. }
  278. static void
  279. identity_bind_fs_state(struct pipe_context *_pipe,
  280. void *fs)
  281. {
  282. struct identity_context *id_pipe = identity_context(_pipe);
  283. struct pipe_context *pipe = id_pipe->pipe;
  284. pipe->bind_fs_state(pipe,
  285. fs);
  286. }
  287. static void
  288. identity_delete_fs_state(struct pipe_context *_pipe,
  289. void *fs)
  290. {
  291. struct identity_context *id_pipe = identity_context(_pipe);
  292. struct pipe_context *pipe = id_pipe->pipe;
  293. pipe->delete_fs_state(pipe,
  294. fs);
  295. }
  296. static void *
  297. identity_create_vs_state(struct pipe_context *_pipe,
  298. const struct pipe_shader_state *vs)
  299. {
  300. struct identity_context *id_pipe = identity_context(_pipe);
  301. struct pipe_context *pipe = id_pipe->pipe;
  302. return pipe->create_vs_state(pipe,
  303. vs);
  304. }
  305. static void
  306. identity_bind_vs_state(struct pipe_context *_pipe,
  307. void *vs)
  308. {
  309. struct identity_context *id_pipe = identity_context(_pipe);
  310. struct pipe_context *pipe = id_pipe->pipe;
  311. pipe->bind_vs_state(pipe,
  312. vs);
  313. }
  314. static void
  315. identity_delete_vs_state(struct pipe_context *_pipe,
  316. void *vs)
  317. {
  318. struct identity_context *id_pipe = identity_context(_pipe);
  319. struct pipe_context *pipe = id_pipe->pipe;
  320. pipe->delete_vs_state(pipe,
  321. vs);
  322. }
  323. static void *
  324. identity_create_vertex_elements_state(struct pipe_context *_pipe,
  325. unsigned num_elements,
  326. const struct pipe_vertex_element *vertex_elements)
  327. {
  328. struct identity_context *id_pipe = identity_context(_pipe);
  329. struct pipe_context *pipe = id_pipe->pipe;
  330. return pipe->create_vertex_elements_state(pipe,
  331. num_elements,
  332. vertex_elements);
  333. }
  334. static void
  335. identity_bind_vertex_elements_state(struct pipe_context *_pipe,
  336. void *velems)
  337. {
  338. struct identity_context *id_pipe = identity_context(_pipe);
  339. struct pipe_context *pipe = id_pipe->pipe;
  340. pipe->bind_vertex_elements_state(pipe,
  341. velems);
  342. }
  343. static void
  344. identity_delete_vertex_elements_state(struct pipe_context *_pipe,
  345. void *velems)
  346. {
  347. struct identity_context *id_pipe = identity_context(_pipe);
  348. struct pipe_context *pipe = id_pipe->pipe;
  349. pipe->delete_vertex_elements_state(pipe,
  350. velems);
  351. }
  352. static void
  353. identity_set_blend_color(struct pipe_context *_pipe,
  354. const struct pipe_blend_color *blend_color)
  355. {
  356. struct identity_context *id_pipe = identity_context(_pipe);
  357. struct pipe_context *pipe = id_pipe->pipe;
  358. pipe->set_blend_color(pipe,
  359. blend_color);
  360. }
  361. static void
  362. identity_set_stencil_ref(struct pipe_context *_pipe,
  363. const struct pipe_stencil_ref *stencil_ref)
  364. {
  365. struct identity_context *id_pipe = identity_context(_pipe);
  366. struct pipe_context *pipe = id_pipe->pipe;
  367. pipe->set_stencil_ref(pipe,
  368. stencil_ref);
  369. }
  370. static void
  371. identity_set_clip_state(struct pipe_context *_pipe,
  372. const struct pipe_clip_state *clip)
  373. {
  374. struct identity_context *id_pipe = identity_context(_pipe);
  375. struct pipe_context *pipe = id_pipe->pipe;
  376. pipe->set_clip_state(pipe,
  377. clip);
  378. }
  379. static void
  380. identity_set_sample_mask(struct pipe_context *_pipe,
  381. unsigned sample_mask)
  382. {
  383. struct identity_context *id_pipe = identity_context(_pipe);
  384. struct pipe_context *pipe = id_pipe->pipe;
  385. pipe->set_sample_mask(pipe,
  386. sample_mask);
  387. }
  388. static void
  389. identity_set_constant_buffer(struct pipe_context *_pipe,
  390. uint shader,
  391. uint index,
  392. struct pipe_resource *_resource)
  393. {
  394. struct identity_context *id_pipe = identity_context(_pipe);
  395. struct pipe_context *pipe = id_pipe->pipe;
  396. struct pipe_resource *unwrapped_resource;
  397. struct pipe_resource *resource = NULL;
  398. /* XXX hmm? unwrap the input state */
  399. if (_resource) {
  400. unwrapped_resource = identity_resource_unwrap(_resource);
  401. resource = unwrapped_resource;
  402. }
  403. pipe->set_constant_buffer(pipe,
  404. shader,
  405. index,
  406. resource);
  407. }
  408. static void
  409. identity_set_framebuffer_state(struct pipe_context *_pipe,
  410. const struct pipe_framebuffer_state *_state)
  411. {
  412. struct identity_context *id_pipe = identity_context(_pipe);
  413. struct pipe_context *pipe = id_pipe->pipe;
  414. struct pipe_framebuffer_state unwrapped_state;
  415. struct pipe_framebuffer_state *state = NULL;
  416. unsigned i;
  417. /* unwrap the input state */
  418. if (_state) {
  419. memcpy(&unwrapped_state, _state, sizeof(unwrapped_state));
  420. for(i = 0; i < _state->nr_cbufs; i++)
  421. unwrapped_state.cbufs[i] = identity_surface_unwrap(_state->cbufs[i]);
  422. for (; i < PIPE_MAX_COLOR_BUFS; i++)
  423. unwrapped_state.cbufs[i] = NULL;
  424. unwrapped_state.zsbuf = identity_surface_unwrap(_state->zsbuf);
  425. state = &unwrapped_state;
  426. }
  427. pipe->set_framebuffer_state(pipe,
  428. state);
  429. }
  430. static void
  431. identity_set_polygon_stipple(struct pipe_context *_pipe,
  432. const struct pipe_poly_stipple *poly_stipple)
  433. {
  434. struct identity_context *id_pipe = identity_context(_pipe);
  435. struct pipe_context *pipe = id_pipe->pipe;
  436. pipe->set_polygon_stipple(pipe,
  437. poly_stipple);
  438. }
  439. static void
  440. identity_set_scissor_state(struct pipe_context *_pipe,
  441. const struct pipe_scissor_state *scissor)
  442. {
  443. struct identity_context *id_pipe = identity_context(_pipe);
  444. struct pipe_context *pipe = id_pipe->pipe;
  445. pipe->set_scissor_state(pipe,
  446. scissor);
  447. }
  448. static void
  449. identity_set_viewport_state(struct pipe_context *_pipe,
  450. const struct pipe_viewport_state *viewport)
  451. {
  452. struct identity_context *id_pipe = identity_context(_pipe);
  453. struct pipe_context *pipe = id_pipe->pipe;
  454. pipe->set_viewport_state(pipe,
  455. viewport);
  456. }
  457. static void
  458. identity_set_fragment_sampler_views(struct pipe_context *_pipe,
  459. unsigned num,
  460. struct pipe_sampler_view **_views)
  461. {
  462. struct identity_context *id_pipe = identity_context(_pipe);
  463. struct pipe_context *pipe = id_pipe->pipe;
  464. struct pipe_sampler_view *unwrapped_views[PIPE_MAX_SAMPLERS];
  465. struct pipe_sampler_view **views = NULL;
  466. unsigned i;
  467. if (_views) {
  468. for (i = 0; i < num; i++)
  469. unwrapped_views[i] = identity_sampler_view_unwrap(_views[i]);
  470. for (; i < PIPE_MAX_SAMPLERS; i++)
  471. unwrapped_views[i] = NULL;
  472. views = unwrapped_views;
  473. }
  474. pipe->set_fragment_sampler_views(pipe, num, views);
  475. }
  476. static void
  477. identity_set_vertex_sampler_views(struct pipe_context *_pipe,
  478. unsigned num,
  479. struct pipe_sampler_view **_views)
  480. {
  481. struct identity_context *id_pipe = identity_context(_pipe);
  482. struct pipe_context *pipe = id_pipe->pipe;
  483. struct pipe_sampler_view *unwrapped_views[PIPE_MAX_VERTEX_SAMPLERS];
  484. struct pipe_sampler_view **views = NULL;
  485. unsigned i;
  486. if (_views) {
  487. for (i = 0; i < num; i++)
  488. unwrapped_views[i] = identity_sampler_view_unwrap(_views[i]);
  489. for (; i < PIPE_MAX_VERTEX_SAMPLERS; i++)
  490. unwrapped_views[i] = NULL;
  491. views = unwrapped_views;
  492. }
  493. pipe->set_vertex_sampler_views(pipe, num, views);
  494. }
  495. static void
  496. identity_set_vertex_buffers(struct pipe_context *_pipe,
  497. unsigned num_buffers,
  498. const struct pipe_vertex_buffer *_buffers)
  499. {
  500. struct identity_context *id_pipe = identity_context(_pipe);
  501. struct pipe_context *pipe = id_pipe->pipe;
  502. struct pipe_vertex_buffer unwrapped_buffers[PIPE_MAX_SHADER_INPUTS];
  503. struct pipe_vertex_buffer *buffers = NULL;
  504. unsigned i;
  505. if (num_buffers) {
  506. memcpy(unwrapped_buffers, _buffers, num_buffers * sizeof(*_buffers));
  507. for (i = 0; i < num_buffers; i++)
  508. unwrapped_buffers[i].buffer = identity_resource_unwrap(_buffers[i].buffer);
  509. buffers = unwrapped_buffers;
  510. }
  511. pipe->set_vertex_buffers(pipe,
  512. num_buffers,
  513. buffers);
  514. }
  515. static void
  516. identity_resource_copy_region(struct pipe_context *_pipe,
  517. struct pipe_resource *_dst,
  518. struct pipe_subresource subdst,
  519. unsigned dstx,
  520. unsigned dsty,
  521. unsigned dstz,
  522. struct pipe_resource *_src,
  523. struct pipe_subresource subsrc,
  524. unsigned srcx,
  525. unsigned srcy,
  526. unsigned srcz,
  527. unsigned width,
  528. unsigned height)
  529. {
  530. struct identity_context *id_pipe = identity_context(_pipe);
  531. struct identity_resource *id_resource_dst = identity_resource(_dst);
  532. struct identity_resource *id_resource_src = identity_resource(_src);
  533. struct pipe_context *pipe = id_pipe->pipe;
  534. struct pipe_resource *dst = id_resource_dst->resource;
  535. struct pipe_resource *src = id_resource_src->resource;
  536. pipe->resource_copy_region(pipe,
  537. dst,
  538. subdst,
  539. dstx,
  540. dsty,
  541. dstz,
  542. src,
  543. subsrc,
  544. srcx,
  545. srcy,
  546. srcz,
  547. width,
  548. height);
  549. }
  550. static void
  551. identity_clear(struct pipe_context *_pipe,
  552. unsigned buffers,
  553. const float *rgba,
  554. double depth,
  555. unsigned stencil)
  556. {
  557. struct identity_context *id_pipe = identity_context(_pipe);
  558. struct pipe_context *pipe = id_pipe->pipe;
  559. pipe->clear(pipe,
  560. buffers,
  561. rgba,
  562. depth,
  563. stencil);
  564. }
  565. static void
  566. identity_clear_render_target(struct pipe_context *_pipe,
  567. struct pipe_surface *_dst,
  568. const float *rgba,
  569. unsigned dstx, unsigned dsty,
  570. unsigned width, unsigned height)
  571. {
  572. struct identity_context *id_pipe = identity_context(_pipe);
  573. struct identity_surface *id_surface_dst = identity_surface(_dst);
  574. struct pipe_context *pipe = id_pipe->pipe;
  575. struct pipe_surface *dst = id_surface_dst->surface;
  576. pipe->clear_render_target(pipe,
  577. dst,
  578. rgba,
  579. dstx,
  580. dsty,
  581. width,
  582. height);
  583. }
  584. static void
  585. identity_clear_depth_stencil(struct pipe_context *_pipe,
  586. struct pipe_surface *_dst,
  587. unsigned clear_flags,
  588. double depth,
  589. unsigned stencil,
  590. unsigned dstx, unsigned dsty,
  591. unsigned width, unsigned height)
  592. {
  593. struct identity_context *id_pipe = identity_context(_pipe);
  594. struct identity_surface *id_surface_dst = identity_surface(_dst);
  595. struct pipe_context *pipe = id_pipe->pipe;
  596. struct pipe_surface *dst = id_surface_dst->surface;
  597. pipe->clear_depth_stencil(pipe,
  598. dst,
  599. clear_flags,
  600. depth,
  601. stencil,
  602. dstx,
  603. dsty,
  604. width,
  605. height);
  606. }
  607. static void
  608. identity_flush(struct pipe_context *_pipe,
  609. unsigned flags,
  610. struct pipe_fence_handle **fence)
  611. {
  612. struct identity_context *id_pipe = identity_context(_pipe);
  613. struct pipe_context *pipe = id_pipe->pipe;
  614. pipe->flush(pipe,
  615. flags,
  616. fence);
  617. }
  618. static unsigned int
  619. identity_is_resource_referenced(struct pipe_context *_pipe,
  620. struct pipe_resource *_resource,
  621. unsigned face,
  622. unsigned level)
  623. {
  624. struct identity_context *id_pipe = identity_context(_pipe);
  625. struct identity_resource *id_resource = identity_resource(_resource);
  626. struct pipe_context *pipe = id_pipe->pipe;
  627. struct pipe_resource *resource = id_resource->resource;
  628. return pipe->is_resource_referenced(pipe,
  629. resource,
  630. face,
  631. level);
  632. }
  633. static struct pipe_sampler_view *
  634. identity_context_create_sampler_view(struct pipe_context *_pipe,
  635. struct pipe_resource *_resource,
  636. const struct pipe_sampler_view *templ)
  637. {
  638. struct identity_context *id_context = identity_context(_pipe);
  639. struct identity_resource *id_resource = identity_resource(_resource);
  640. struct pipe_context *pipe = id_context->pipe;
  641. struct pipe_resource *resource = id_resource->resource;
  642. struct pipe_sampler_view *result;
  643. result = pipe->create_sampler_view(pipe,
  644. resource,
  645. templ);
  646. if (result)
  647. return identity_sampler_view_create(id_context, id_resource, result);
  648. return NULL;
  649. }
  650. static void
  651. identity_context_sampler_view_destroy(struct pipe_context *_pipe,
  652. struct pipe_sampler_view *_view)
  653. {
  654. identity_sampler_view_destroy(identity_context(_pipe),
  655. identity_sampler_view(_view));
  656. }
  657. static struct pipe_transfer *
  658. identity_context_get_transfer(struct pipe_context *_context,
  659. struct pipe_resource *_resource,
  660. struct pipe_subresource sr,
  661. unsigned usage,
  662. const struct pipe_box *box)
  663. {
  664. struct identity_context *id_context = identity_context(_context);
  665. struct identity_resource *id_resource = identity_resource(_resource);
  666. struct pipe_context *context = id_context->pipe;
  667. struct pipe_resource *resource = id_resource->resource;
  668. struct pipe_transfer *result;
  669. result = context->get_transfer(context,
  670. resource,
  671. sr,
  672. usage,
  673. box);
  674. if (result)
  675. return identity_transfer_create(id_context, id_resource, result);
  676. return NULL;
  677. }
  678. static void
  679. identity_context_transfer_destroy(struct pipe_context *_pipe,
  680. struct pipe_transfer *_transfer)
  681. {
  682. identity_transfer_destroy(identity_context(_pipe),
  683. identity_transfer(_transfer));
  684. }
  685. static void *
  686. identity_context_transfer_map(struct pipe_context *_context,
  687. struct pipe_transfer *_transfer)
  688. {
  689. struct identity_context *id_context = identity_context(_context);
  690. struct identity_transfer *id_transfer = identity_transfer(_transfer);
  691. struct pipe_context *context = id_context->pipe;
  692. struct pipe_transfer *transfer = id_transfer->transfer;
  693. return context->transfer_map(context,
  694. transfer);
  695. }
  696. static void
  697. identity_context_transfer_flush_region(struct pipe_context *_context,
  698. struct pipe_transfer *_transfer,
  699. const struct pipe_box *box)
  700. {
  701. struct identity_context *id_context = identity_context(_context);
  702. struct identity_transfer *id_transfer = identity_transfer(_transfer);
  703. struct pipe_context *context = id_context->pipe;
  704. struct pipe_transfer *transfer = id_transfer->transfer;
  705. context->transfer_flush_region(context,
  706. transfer,
  707. box);
  708. }
  709. static void
  710. identity_context_transfer_unmap(struct pipe_context *_context,
  711. struct pipe_transfer *_transfer)
  712. {
  713. struct identity_context *id_context = identity_context(_context);
  714. struct identity_transfer *id_transfer = identity_transfer(_transfer);
  715. struct pipe_context *context = id_context->pipe;
  716. struct pipe_transfer *transfer = id_transfer->transfer;
  717. context->transfer_unmap(context,
  718. transfer);
  719. }
  720. static void
  721. identity_context_transfer_inline_write(struct pipe_context *_context,
  722. struct pipe_resource *_resource,
  723. struct pipe_subresource sr,
  724. unsigned usage,
  725. const struct pipe_box *box,
  726. const void *data,
  727. unsigned stride,
  728. unsigned slice_stride)
  729. {
  730. struct identity_context *id_context = identity_context(_context);
  731. struct identity_resource *id_resource = identity_resource(_resource);
  732. struct pipe_context *context = id_context->pipe;
  733. struct pipe_resource *resource = id_resource->resource;
  734. context->transfer_inline_write(context,
  735. resource,
  736. sr,
  737. usage,
  738. box,
  739. data,
  740. stride,
  741. slice_stride);
  742. }
  743. struct pipe_context *
  744. identity_context_create(struct pipe_screen *_screen, struct pipe_context *pipe)
  745. {
  746. struct identity_context *id_pipe;
  747. (void)identity_screen(_screen);
  748. id_pipe = CALLOC_STRUCT(identity_context);
  749. if (!id_pipe) {
  750. return NULL;
  751. }
  752. id_pipe->base.winsys = NULL;
  753. id_pipe->base.screen = _screen;
  754. id_pipe->base.priv = pipe->priv; /* expose wrapped data */
  755. id_pipe->base.draw = NULL;
  756. id_pipe->base.destroy = identity_destroy;
  757. id_pipe->base.draw_arrays = identity_draw_arrays;
  758. id_pipe->base.draw_elements = identity_draw_elements;
  759. id_pipe->base.draw_range_elements = identity_draw_range_elements;
  760. id_pipe->base.create_query = identity_create_query;
  761. id_pipe->base.destroy_query = identity_destroy_query;
  762. id_pipe->base.begin_query = identity_begin_query;
  763. id_pipe->base.end_query = identity_end_query;
  764. id_pipe->base.get_query_result = identity_get_query_result;
  765. id_pipe->base.create_blend_state = identity_create_blend_state;
  766. id_pipe->base.bind_blend_state = identity_bind_blend_state;
  767. id_pipe->base.delete_blend_state = identity_delete_blend_state;
  768. id_pipe->base.create_sampler_state = identity_create_sampler_state;
  769. id_pipe->base.bind_fragment_sampler_states = identity_bind_fragment_sampler_states;
  770. id_pipe->base.bind_vertex_sampler_states = identity_bind_vertex_sampler_states;
  771. id_pipe->base.delete_sampler_state = identity_delete_sampler_state;
  772. id_pipe->base.create_rasterizer_state = identity_create_rasterizer_state;
  773. id_pipe->base.bind_rasterizer_state = identity_bind_rasterizer_state;
  774. id_pipe->base.delete_rasterizer_state = identity_delete_rasterizer_state;
  775. id_pipe->base.create_depth_stencil_alpha_state = identity_create_depth_stencil_alpha_state;
  776. id_pipe->base.bind_depth_stencil_alpha_state = identity_bind_depth_stencil_alpha_state;
  777. id_pipe->base.delete_depth_stencil_alpha_state = identity_delete_depth_stencil_alpha_state;
  778. id_pipe->base.create_fs_state = identity_create_fs_state;
  779. id_pipe->base.bind_fs_state = identity_bind_fs_state;
  780. id_pipe->base.delete_fs_state = identity_delete_fs_state;
  781. id_pipe->base.create_vs_state = identity_create_vs_state;
  782. id_pipe->base.bind_vs_state = identity_bind_vs_state;
  783. id_pipe->base.delete_vs_state = identity_delete_vs_state;
  784. id_pipe->base.create_vertex_elements_state = identity_create_vertex_elements_state;
  785. id_pipe->base.bind_vertex_elements_state = identity_bind_vertex_elements_state;
  786. id_pipe->base.delete_vertex_elements_state = identity_delete_vertex_elements_state;
  787. id_pipe->base.set_blend_color = identity_set_blend_color;
  788. id_pipe->base.set_stencil_ref = identity_set_stencil_ref;
  789. id_pipe->base.set_clip_state = identity_set_clip_state;
  790. id_pipe->base.set_sample_mask = identity_set_sample_mask;
  791. id_pipe->base.set_constant_buffer = identity_set_constant_buffer;
  792. id_pipe->base.set_framebuffer_state = identity_set_framebuffer_state;
  793. id_pipe->base.set_polygon_stipple = identity_set_polygon_stipple;
  794. id_pipe->base.set_scissor_state = identity_set_scissor_state;
  795. id_pipe->base.set_viewport_state = identity_set_viewport_state;
  796. id_pipe->base.set_fragment_sampler_views = identity_set_fragment_sampler_views;
  797. id_pipe->base.set_vertex_sampler_views = identity_set_vertex_sampler_views;
  798. id_pipe->base.set_vertex_buffers = identity_set_vertex_buffers;
  799. id_pipe->base.resource_copy_region = identity_resource_copy_region;
  800. id_pipe->base.clear = identity_clear;
  801. id_pipe->base.clear_render_target = identity_clear_render_target;
  802. id_pipe->base.clear_depth_stencil = identity_clear_depth_stencil;
  803. id_pipe->base.flush = identity_flush;
  804. id_pipe->base.is_resource_referenced = identity_is_resource_referenced;
  805. id_pipe->base.create_sampler_view = identity_context_create_sampler_view;
  806. id_pipe->base.sampler_view_destroy = identity_context_sampler_view_destroy;
  807. id_pipe->base.get_transfer = identity_context_get_transfer;
  808. id_pipe->base.transfer_destroy = identity_context_transfer_destroy;
  809. id_pipe->base.transfer_map = identity_context_transfer_map;
  810. id_pipe->base.transfer_unmap = identity_context_transfer_unmap;
  811. id_pipe->base.transfer_flush_region = identity_context_transfer_flush_region;
  812. id_pipe->base.transfer_inline_write = identity_context_transfer_inline_write;
  813. id_pipe->pipe = pipe;
  814. return &id_pipe->base;
  815. }