1 /************************************************************************** 2 * 3 * Copyright 2009 Marek Olšák <maraeo@gmail.com> 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 **************************************************************************/ 26 27 #ifndef U_BLITTER_H 28 #define U_BLITTER_H 29 30 #include "util/u_framebuffer.h" 31 #include "util/u_inlines.h" 32 33 #include "pipe/p_state.h" 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 struct pipe_context; 40 41 enum blitter_attrib_type { 42 UTIL_BLITTER_ATTRIB_NONE, 43 UTIL_BLITTER_ATTRIB_COLOR, 44 UTIL_BLITTER_ATTRIB_TEXCOORD_XY, 45 UTIL_BLITTER_ATTRIB_TEXCOORD_XYZW, 46 }; 47 48 union blitter_attrib { 49 float color[4]; 50 51 struct { 52 float x1, y1, x2, y2, z, w; 53 } texcoord; 54 }; 55 56 struct blitter_context; 57 58 typedef void *(*blitter_get_vs_func)(struct blitter_context *blitter); 59 60 struct blitter_context 61 { 62 /** 63 * Draw a rectangle. 64 * 65 * \param get_vs Callback for obtaining the vertex shader for the draw call. 66 * It might invoke the shader compiler. The driver is 67 * responsible for setting the vertex shader, and the callback 68 * allows the driver to query the vertex shader CSO if it 69 * wants to use the default one. 70 * \param x1 An X coordinate of the top-left corner. 71 * \param y1 A Y coordinate of the top-left corner. 72 * \param x2 An X coordinate of the bottom-right corner. 73 * \param y2 A Y coordinate of the bottom-right corner. 74 * \param depth A depth which the rectangle is rendered at. 75 * 76 * \param type Semantics of the attributes "attrib". 77 * If type is UTIL_BLITTER_ATTRIB_NONE, ignore them. 78 * If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes 79 * make up a constant RGBA color, and should go 80 * to the GENERIC0 varying slot of a fragment shader. 81 * If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and 82 * {a3, a4} specify top-left and bottom-right texture 83 * coordinates of the rectangle, respectively, and should go 84 * to the GENERIC0 varying slot of a fragment shader. 85 * 86 * \param attrib See type. 87 * 88 * \note A driver may optionally override this callback to implement 89 * a specialized hardware path for drawing a rectangle, e.g. using 90 * a rectangular point sprite. 91 */ 92 void (*draw_rectangle)(struct blitter_context *blitter, 93 void *vertex_elements_cso, 94 blitter_get_vs_func get_vs, 95 int x1, int y1, int x2, int y2, 96 float depth, unsigned num_instances, 97 enum blitter_attrib_type type, 98 const union blitter_attrib *attrib); 99 100 /* Whether the blitter is running. */ 101 bool running; 102 103 bool use_index_buffer; 104 105 /* Private members, really. */ 106 struct pipe_context *pipe; /**< pipe context */ 107 108 void *saved_blend_state; /**< blend state */ 109 void *saved_dsa_state; /**< depth stencil alpha state */ 110 void *saved_velem_state; /**< vertex elements state */ 111 void *saved_rs_state; /**< rasterizer state */ 112 void *saved_fs, *saved_vs, *saved_gs, *saved_tcs, *saved_tes; /**< shaders */ 113 114 struct pipe_framebuffer_state saved_fb_state; /**< framebuffer state */ 115 struct pipe_stencil_ref saved_stencil_ref; /**< stencil ref */ 116 struct pipe_viewport_state saved_viewport; 117 struct pipe_scissor_state saved_scissor; 118 bool skip_viewport_restore; 119 bool is_sample_mask_saved; 120 unsigned saved_sample_mask; 121 122 unsigned saved_num_sampler_states; 123 void *saved_sampler_states[PIPE_MAX_SAMPLERS]; 124 125 unsigned saved_num_sampler_views; 126 struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS]; 127 128 unsigned cb_slot; 129 struct pipe_constant_buffer saved_fs_constant_buffer; 130 131 unsigned vb_slot; 132 struct pipe_vertex_buffer saved_vertex_buffer; 133 134 unsigned saved_num_so_targets; 135 struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS]; 136 137 struct pipe_query *saved_render_cond_query; 138 uint saved_render_cond_mode; 139 bool saved_render_cond_cond; 140 141 boolean saved_window_rectangles_include; 142 unsigned saved_num_window_rectangles; 143 struct pipe_scissor_state saved_window_rectangles[PIPE_MAX_WINDOW_RECTANGLES]; 144 }; 145 146 /** 147 * Create a blitter context. 148 */ 149 struct blitter_context *util_blitter_create(struct pipe_context *pipe); 150 151 /** 152 * Destroy a blitter context. 153 */ 154 void util_blitter_destroy(struct blitter_context *blitter); 155 156 void util_blitter_cache_all_shaders(struct blitter_context *blitter); 157 void *util_blitter_get_noop_blend_state(struct blitter_context *blitter); 158 void *util_blitter_get_noop_dsa_state(struct blitter_context *blitter); 159 void *util_blitter_get_discard_rasterizer_state(struct blitter_context *blitter); 160 161 162 /** 163 * Return the pipe context associated with a blitter context. 164 */ 165 static inline util_blitter_get_pipe(struct blitter_context * blitter)166 struct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter) 167 { 168 return blitter->pipe; 169 } 170 171 /** 172 * Override PIPE_CAP_TEXTURE_MULTISAMPLE as reported by the driver. 173 */ 174 void util_blitter_set_texture_multisample(struct blitter_context *blitter, 175 bool supported); 176 177 /* The default function to draw a rectangle. This can only be used 178 * inside of the draw_rectangle callback if the driver overrides it. */ 179 void util_blitter_draw_rectangle(struct blitter_context *blitter, 180 void *vertex_elements_cso, 181 blitter_get_vs_func get_vs, 182 int x1, int y1, int x2, int y2, 183 float depth, unsigned num_instances, 184 enum blitter_attrib_type type, 185 const union blitter_attrib *attrib); 186 187 188 /* 189 * These states must be saved before any of the following functions are called: 190 * - vertex buffers 191 * - vertex elements 192 * - vertex shader 193 * - geometry shader (if supported) 194 * - stream output targets (if supported) 195 * - rasterizer state 196 */ 197 198 /** 199 * Clear a specified set of currently bound buffers to specified values. 200 * 201 * These states must be saved in the blitter in addition to the state objects 202 * already required to be saved: 203 * - fragment shader 204 * - depth stencil alpha state 205 * - blend state 206 */ 207 void util_blitter_clear(struct blitter_context *blitter, 208 unsigned width, unsigned height, unsigned num_layers, 209 unsigned clear_buffers, 210 const union pipe_color_union *color, 211 double depth, unsigned stencil, 212 bool msaa); 213 214 /** 215 * Check if the blitter (with the help of the driver) can blit between 216 * the two resources. 217 */ 218 bool util_blitter_is_copy_supported(struct blitter_context *blitter, 219 const struct pipe_resource *dst, 220 const struct pipe_resource *src); 221 222 bool util_blitter_is_blit_supported(struct blitter_context *blitter, 223 const struct pipe_blit_info *info); 224 225 /** 226 * Copy a block of pixels from one surface to another. 227 * 228 * These states must be saved in the blitter in addition to the state objects 229 * already required to be saved: 230 * - fragment shader 231 * - depth stencil alpha state 232 * - blend state 233 * - fragment sampler states 234 * - fragment sampler textures 235 * - framebuffer state 236 * - sample mask 237 */ 238 void util_blitter_copy_texture(struct blitter_context *blitter, 239 struct pipe_resource *dst, 240 unsigned dst_level, 241 unsigned dstx, unsigned dsty, unsigned dstz, 242 struct pipe_resource *src, 243 unsigned src_level, 244 const struct pipe_box *srcbox); 245 246 /** 247 * This is a generic implementation of pipe->blit, which accepts 248 * sampler/surface views instead of resources. 249 * 250 * The layer and mipmap level are specified by the views. 251 * 252 * Drivers can use this to change resource properties (like format, width, 253 * height) by changing how the views interpret them, instead of changing 254 * pipe_resource directly. This is used to blit resources of formats which 255 * are not renderable. 256 * 257 * src_width0 and src_height0 are sampler_view-private properties that 258 * override pipe_resource. The blitter uses them for computation of texture 259 * coordinates. The dst dimensions are supplied through pipe_surface::width 260 * and height. 261 * 262 * The mask is a combination of the PIPE_MASK_* flags. 263 * Set to PIPE_MASK_RGBAZS if unsure. 264 */ 265 void util_blitter_blit_generic(struct blitter_context *blitter, 266 struct pipe_surface *dst, 267 const struct pipe_box *dstbox, 268 struct pipe_sampler_view *src, 269 const struct pipe_box *srcbox, 270 unsigned src_width0, unsigned src_height0, 271 unsigned mask, unsigned filter, 272 const struct pipe_scissor_state *scissor, 273 bool alpha_blend); 274 275 void util_blitter_blit(struct blitter_context *blitter, 276 const struct pipe_blit_info *info); 277 278 void util_blitter_generate_mipmap(struct blitter_context *blitter, 279 struct pipe_resource *tex, 280 enum pipe_format format, 281 unsigned base_level, unsigned last_level, 282 unsigned first_layer, unsigned last_layer); 283 284 /** 285 * Helper function to initialize a view for copy_texture_view. 286 * The parameters must match copy_texture_view. 287 */ 288 void util_blitter_default_dst_texture(struct pipe_surface *dst_templ, 289 struct pipe_resource *dst, 290 unsigned dstlevel, 291 unsigned dstz); 292 293 /** 294 * Helper function to initialize a view for copy_texture_view. 295 * The parameters must match copy_texture_view. 296 */ 297 void util_blitter_default_src_texture(struct blitter_context *blitter, 298 struct pipe_sampler_view *src_templ, 299 struct pipe_resource *src, 300 unsigned srclevel); 301 302 /** 303 * Copy data from one buffer to another using the Stream Output functionality. 304 * 4-byte alignment is required, otherwise software fallback is used. 305 */ 306 void util_blitter_copy_buffer(struct blitter_context *blitter, 307 struct pipe_resource *dst, 308 unsigned dstx, 309 struct pipe_resource *src, 310 unsigned srcx, 311 unsigned size); 312 313 /** 314 * Clear the contents of a buffer using the Stream Output functionality. 315 * 4-byte alignment is required. 316 * 317 * "num_channels" can be 1, 2, 3, or 4, and specifies if the clear value is 318 * R, RG, RGB, or RGBA. 319 * 320 * For each element, only "num_channels" components of "clear_value" are 321 * copied to the buffer, then the offset is incremented by num_channels*4. 322 */ 323 void util_blitter_clear_buffer(struct blitter_context *blitter, 324 struct pipe_resource *dst, 325 unsigned offset, unsigned size, 326 unsigned num_channels, 327 const union pipe_color_union *clear_value); 328 329 /** 330 * Clear a region of a (color) surface to a constant value. 331 * 332 * These states must be saved in the blitter in addition to the state objects 333 * already required to be saved: 334 * - fragment shader 335 * - depth stencil alpha state 336 * - blend state 337 * - framebuffer state 338 */ 339 void util_blitter_clear_render_target(struct blitter_context *blitter, 340 struct pipe_surface *dst, 341 const union pipe_color_union *color, 342 unsigned dstx, unsigned dsty, 343 unsigned width, unsigned height); 344 345 /** 346 * Clear a region of a depth-stencil surface, both stencil and depth 347 * or only one of them if this is a combined depth-stencil surface. 348 * 349 * These states must be saved in the blitter in addition to the state objects 350 * already required to be saved: 351 * - fragment shader 352 * - depth stencil alpha state 353 * - blend state 354 * - framebuffer state 355 */ 356 void util_blitter_clear_depth_stencil(struct blitter_context *blitter, 357 struct pipe_surface *dst, 358 unsigned clear_flags, 359 double depth, 360 unsigned stencil, 361 unsigned dstx, unsigned dsty, 362 unsigned width, unsigned height); 363 364 /* The following functions are customized variants of the clear functions. 365 * Some drivers use them internally to do things like MSAA resolve 366 * and resource decompression. It usually consists of rendering a full-screen 367 * quad with a special blend or DSA state. 368 */ 369 370 /* Used by r300g for depth decompression. */ 371 void util_blitter_custom_clear_depth(struct blitter_context *blitter, 372 unsigned width, unsigned height, 373 double depth, void *custom_dsa); 374 375 /* Used by r600g for depth decompression. */ 376 void util_blitter_custom_depth_stencil(struct blitter_context *blitter, 377 struct pipe_surface *zsurf, 378 struct pipe_surface *cbsurf, 379 unsigned sample_mask, 380 void *dsa_stage, float depth); 381 382 /* Used by r600g for color decompression. */ 383 void util_blitter_custom_color(struct blitter_context *blitter, 384 struct pipe_surface *dstsurf, 385 void *custom_blend); 386 387 /* Used by r600g for MSAA color resolve. */ 388 void util_blitter_custom_resolve_color(struct blitter_context *blitter, 389 struct pipe_resource *dst, 390 unsigned dst_level, 391 unsigned dst_layer, 392 struct pipe_resource *src, 393 unsigned src_layer, 394 unsigned sampled_mask, 395 void *custom_blend, 396 enum pipe_format format); 397 398 /* Used by vc4 for 8/16-bit linear-to-tiled blits */ 399 void util_blitter_custom_shader(struct blitter_context *blitter, 400 struct pipe_surface *dstsurf, 401 void *custom_vs, void *custom_fs); 402 403 /* Used by D3D12 for non-MSAA -> MSAA stencil blits */ 404 void util_blitter_stencil_fallback(struct blitter_context *blitter, 405 struct pipe_resource *dst, 406 unsigned dst_level, 407 const struct pipe_box *dstbox, 408 struct pipe_resource *src, 409 unsigned src_level, 410 const struct pipe_box *srcbox, 411 const struct pipe_scissor_state *scissor); 412 413 /* The functions below should be used to save currently bound constant state 414 * objects inside a driver. The objects are automatically restored at the end 415 * of the util_blitter_{clear, copy_region, fill_region} functions and then 416 * forgotten. 417 * 418 * States not listed here are not affected by util_blitter. */ 419 420 static inline void util_blitter_save_blend(struct blitter_context * blitter,void * state)421 util_blitter_save_blend(struct blitter_context *blitter, void *state) 422 { 423 blitter->saved_blend_state = state; 424 } 425 426 static inline void util_blitter_save_depth_stencil_alpha(struct blitter_context * blitter,void * state)427 util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter, 428 void *state) 429 { 430 blitter->saved_dsa_state = state; 431 } 432 433 static inline void util_blitter_save_vertex_elements(struct blitter_context * blitter,void * state)434 util_blitter_save_vertex_elements(struct blitter_context *blitter, void *state) 435 { 436 blitter->saved_velem_state = state; 437 } 438 439 static inline void util_blitter_save_stencil_ref(struct blitter_context * blitter,const struct pipe_stencil_ref * state)440 util_blitter_save_stencil_ref(struct blitter_context *blitter, 441 const struct pipe_stencil_ref *state) 442 { 443 blitter->saved_stencil_ref = *state; 444 } 445 446 static inline void util_blitter_save_rasterizer(struct blitter_context * blitter,void * state)447 util_blitter_save_rasterizer(struct blitter_context *blitter, void *state) 448 { 449 blitter->saved_rs_state = state; 450 } 451 452 static inline void util_blitter_save_fragment_shader(struct blitter_context * blitter,void * fs)453 util_blitter_save_fragment_shader(struct blitter_context *blitter, void *fs) 454 { 455 blitter->saved_fs = fs; 456 } 457 458 static inline void util_blitter_save_vertex_shader(struct blitter_context * blitter,void * vs)459 util_blitter_save_vertex_shader(struct blitter_context *blitter, void *vs) 460 { 461 blitter->saved_vs = vs; 462 } 463 464 static inline void util_blitter_save_geometry_shader(struct blitter_context * blitter,void * gs)465 util_blitter_save_geometry_shader(struct blitter_context *blitter, void *gs) 466 { 467 blitter->saved_gs = gs; 468 } 469 470 static inline void util_blitter_save_tessctrl_shader(struct blitter_context * blitter,void * sh)471 util_blitter_save_tessctrl_shader(struct blitter_context *blitter, 472 void *sh) 473 { 474 blitter->saved_tcs = sh; 475 } 476 477 static inline void util_blitter_save_tesseval_shader(struct blitter_context * blitter,void * sh)478 util_blitter_save_tesseval_shader(struct blitter_context *blitter, 479 void *sh) 480 { 481 blitter->saved_tes = sh; 482 } 483 484 static inline void util_blitter_save_framebuffer(struct blitter_context * blitter,const struct pipe_framebuffer_state * state)485 util_blitter_save_framebuffer(struct blitter_context *blitter, 486 const struct pipe_framebuffer_state *state) 487 { 488 blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */ 489 util_copy_framebuffer_state(&blitter->saved_fb_state, state); 490 } 491 492 static inline void util_blitter_save_viewport(struct blitter_context * blitter,struct pipe_viewport_state * state)493 util_blitter_save_viewport(struct blitter_context *blitter, 494 struct pipe_viewport_state *state) 495 { 496 blitter->saved_viewport = *state; 497 } 498 499 static inline void util_blitter_save_scissor(struct blitter_context * blitter,struct pipe_scissor_state * state)500 util_blitter_save_scissor(struct blitter_context *blitter, 501 struct pipe_scissor_state *state) 502 { 503 blitter->saved_scissor = *state; 504 } 505 506 static inline void util_blitter_save_fragment_sampler_states(struct blitter_context * blitter,unsigned num_sampler_states,void ** sampler_states)507 util_blitter_save_fragment_sampler_states( 508 struct blitter_context *blitter, 509 unsigned num_sampler_states, 510 void **sampler_states) 511 { 512 assert(num_sampler_states <= ARRAY_SIZE(blitter->saved_sampler_states)); 513 514 blitter->saved_num_sampler_states = num_sampler_states; 515 memcpy(blitter->saved_sampler_states, sampler_states, 516 num_sampler_states * sizeof(void *)); 517 } 518 519 static inline void util_blitter_save_fragment_sampler_views(struct blitter_context * blitter,unsigned num_views,struct pipe_sampler_view ** views)520 util_blitter_save_fragment_sampler_views(struct blitter_context *blitter, 521 unsigned num_views, 522 struct pipe_sampler_view **views) 523 { 524 unsigned i; 525 assert(num_views <= ARRAY_SIZE(blitter->saved_sampler_views)); 526 527 blitter->saved_num_sampler_views = num_views; 528 for (i = 0; i < num_views; i++) 529 pipe_sampler_view_reference(&blitter->saved_sampler_views[i], 530 views[i]); 531 } 532 533 static inline void util_blitter_save_fragment_constant_buffer_slot(struct blitter_context * blitter,struct pipe_constant_buffer * constant_buffers)534 util_blitter_save_fragment_constant_buffer_slot( 535 struct blitter_context *blitter, 536 struct pipe_constant_buffer *constant_buffers) 537 { 538 pipe_resource_reference(&blitter->saved_fs_constant_buffer.buffer, 539 constant_buffers[blitter->cb_slot].buffer); 540 memcpy(&blitter->saved_fs_constant_buffer, &constant_buffers[blitter->cb_slot], 541 sizeof(struct pipe_constant_buffer)); 542 } 543 544 static inline void util_blitter_save_vertex_buffer_slot(struct blitter_context * blitter,struct pipe_vertex_buffer * vertex_buffers)545 util_blitter_save_vertex_buffer_slot(struct blitter_context *blitter, 546 struct pipe_vertex_buffer *vertex_buffers) 547 { 548 pipe_vertex_buffer_reference(&blitter->saved_vertex_buffer, 549 &vertex_buffers[blitter->vb_slot]); 550 } 551 552 static inline void util_blitter_save_so_targets(struct blitter_context * blitter,unsigned num_targets,struct pipe_stream_output_target ** targets)553 util_blitter_save_so_targets(struct blitter_context *blitter, 554 unsigned num_targets, 555 struct pipe_stream_output_target **targets) 556 { 557 unsigned i; 558 assert(num_targets <= ARRAY_SIZE(blitter->saved_so_targets)); 559 560 blitter->saved_num_so_targets = num_targets; 561 for (i = 0; i < num_targets; i++) 562 pipe_so_target_reference(&blitter->saved_so_targets[i], 563 targets[i]); 564 } 565 566 static inline void util_blitter_save_sample_mask(struct blitter_context * blitter,unsigned sample_mask)567 util_blitter_save_sample_mask(struct blitter_context *blitter, 568 unsigned sample_mask) 569 { 570 blitter->is_sample_mask_saved = true; 571 blitter->saved_sample_mask = sample_mask; 572 } 573 574 static inline void util_blitter_save_render_condition(struct blitter_context * blitter,struct pipe_query * query,bool condition,enum pipe_render_cond_flag mode)575 util_blitter_save_render_condition(struct blitter_context *blitter, 576 struct pipe_query *query, 577 bool condition, 578 enum pipe_render_cond_flag mode) 579 { 580 blitter->saved_render_cond_query = query; 581 blitter->saved_render_cond_mode = mode; 582 blitter->saved_render_cond_cond = condition; 583 } 584 585 static inline void util_blitter_save_window_rectangles(struct blitter_context * blitter,boolean include,unsigned num_rectangles,const struct pipe_scissor_state * rects)586 util_blitter_save_window_rectangles(struct blitter_context *blitter, 587 boolean include, 588 unsigned num_rectangles, 589 const struct pipe_scissor_state *rects) 590 { 591 blitter->saved_window_rectangles_include = include; 592 blitter->saved_num_window_rectangles = num_rectangles; 593 if (num_rectangles > 0) { 594 assert(num_rectangles < ARRAY_SIZE(blitter->saved_window_rectangles)); 595 memcpy(blitter->saved_window_rectangles, rects, 596 sizeof(*rects) * num_rectangles); 597 } 598 } 599 600 void util_blitter_common_clear_setup(struct blitter_context *blitter, 601 unsigned width, unsigned height, 602 unsigned clear_buffers, 603 void *custom_blend, void *custom_dsa); 604 605 void util_blitter_set_running_flag(struct blitter_context *blitter); 606 void util_blitter_unset_running_flag(struct blitter_context *blitter); 607 608 void util_blitter_restore_vertex_states(struct blitter_context *blitter); 609 void util_blitter_restore_fragment_states(struct blitter_context *blitter); 610 void util_blitter_restore_render_cond(struct blitter_context *blitter); 611 void util_blitter_restore_fb_state(struct blitter_context *blitter); 612 void util_blitter_restore_textures(struct blitter_context *blitter); 613 void util_blitter_restore_constant_buffer_state(struct blitter_context *blitter); 614 615 /* These are supported combinations of blits from ZS to color and vice versa. 616 * The blitter will do the packing/unpacking of depth and stencil 617 * in the fragment shader. 618 */ 619 static inline enum pipe_format util_blitter_get_color_format_for_zs(enum pipe_format format)620 util_blitter_get_color_format_for_zs(enum pipe_format format) 621 { 622 switch (format) { 623 case PIPE_FORMAT_Z16_UNORM: 624 return PIPE_FORMAT_R16_UNORM; 625 626 case PIPE_FORMAT_Z32_FLOAT: 627 return PIPE_FORMAT_R32_FLOAT; 628 629 case PIPE_FORMAT_Z24_UNORM_S8_UINT: 630 case PIPE_FORMAT_Z24X8_UNORM: 631 case PIPE_FORMAT_S8_UINT_Z24_UNORM: 632 case PIPE_FORMAT_X8Z24_UNORM: 633 return PIPE_FORMAT_R32_UINT; 634 635 case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 636 return PIPE_FORMAT_R32G32_UINT; 637 638 case PIPE_FORMAT_Z32_UNORM: 639 default: 640 assert(0); 641 } 642 return PIPE_FORMAT_NONE; 643 } 644 645 #ifdef __cplusplus 646 } 647 #endif 648 649 #endif 650