lp_rast_priv.h revision e75da1a8d668aa2a245a7c2690b42ae7a6038f48
1ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca/************************************************************************** 2ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * 3ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * Copyright 2009 VMware, Inc. 4ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * All Rights Reserved. 5ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * 6ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * copy of this software and associated documentation files (the 8ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * "Software"), to deal in the Software without restriction, including 9ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * the following conditions: 13ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * 14ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * The above copyright notice and this permission notice (including the 15ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * next paragraph) shall be included in all copies or substantial portions 16ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * of the Software. 17ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * 18ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca * 26ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca **************************************************************************/ 27ee3383bc5ab81ff12d9faa675c1c38683300ce68José Fonseca 28e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell#ifndef LP_RAST_PRIV_H 29e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell#define LP_RAST_PRIV_H 30e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 31a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca#include "os/os_thread.h" 325e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca#include "util/u_format.h" 335e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca#include "gallivm/lp_bld_debug.h" 342b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul#include "lp_memory.h" 35e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell#include "lp_rast.h" 360639765b2850739af1678f10fc0c5706d5827776Brian Paul#include "lp_scene.h" 374c4f98c6fcabc4a2c9ede3647de390a4585cf58aJosé Fonseca#include "lp_state.h" 380639765b2850739af1678f10fc0c5706d5827776Brian Paul#include "lp_texture.h" 392797f2bf57562c95a601a67edca3089641215cc4Brian Paul#include "lp_tile_soa.h" 4039be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca#include "lp_limits.h" 413a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 423a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 436c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul/* If we crash in a jitted function, we can examine jit_line and jit_state 446c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul * to get some info. This is not thread-safe, however. 456c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul */ 466c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul#ifdef DEBUG 476c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 486c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paulextern int jit_line; 496c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paulextern const struct lp_rast_state *jit_state; 506c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 516c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul#define BEGIN_JIT_CALL(state) \ 526c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul do { \ 536c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul jit_line = __LINE__; \ 546c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul jit_state = state; \ 556c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul } while (0) 566c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 576c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul#define END_JIT_CALL() \ 586c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul do { \ 596c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul jit_line = 0; \ 606c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul jit_state = NULL; \ 616c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul } while (0) 626c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 636c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul#else 646c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 656c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul#define BEGIN_JIT_CALL(X) 66e75da1a8d668aa2a245a7c2690b42ae7a6038f48Brian Paul#define END_JIT_CALL() 676c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 686c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul#endif 696c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 706c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul 71aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paulstruct lp_rasterizer; 72a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca 73a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul 74a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul/** 753a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * Per-thread rasterization state 76a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul */ 773a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paulstruct lp_rasterizer_task 78a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul{ 79a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul unsigned x, y; /**< Pos of this tile in framebuffer, in pixels */ 803a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 810639765b2850739af1678f10fc0c5706d5827776Brian Paul uint8_t *color_tiles[PIPE_MAX_COLOR_BUFS]; 820639765b2850739af1678f10fc0c5706d5827776Brian Paul uint8_t *depth_tile; 830639765b2850739af1678f10fc0c5706d5827776Brian Paul 84aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul /** "back" pointer */ 85aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul struct lp_rasterizer *rast; 86aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 87aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul /** "my" index */ 88aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul unsigned thread_index; 89aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 9086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li /* occlude counter for visiable pixels */ 9186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li uint32_t vis_counter; 9286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 93aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul pipe_semaphore work_ready; 94aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul pipe_semaphore work_done; 953a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul}; 963a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 973a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 983a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul/** 993a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * This is the state required while rasterizing tiles. 1003a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * Note that this contains per-thread information too. 1013a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * The tile size is TILE_SIZE x TILE_SIZE pixels. 1023a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul */ 1033a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paulstruct lp_rasterizer 1043a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul{ 105bc04ae21c10bedcc75d3483784d3eaf7bf090f55Brian Paul boolean exit_flag; 106e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell 107a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul /* Framebuffer stuff 108a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul */ 1095fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell struct { 1105fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell uint8_t *map; 1115fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell unsigned stride; 1125fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell unsigned blocksize; 1135fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell } zsbuf; 114e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell 115e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell struct { 1165fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell unsigned nr_cbufs; 117e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell unsigned clear_color; 118e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell unsigned clear_depth; 119e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell char clear_stencil; 120e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell } state; 1213199c6e764c20c69a76c561b9f4b89a23e5a97f5Keith Whitwell 122663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /** The incoming queue of scenes ready to rasterize */ 123663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene_queue *full_scenes; 1245fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 1255fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /** 1265fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * The outgoing queue of processed scenes to return to setup module 1275fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * 1285fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * XXX: while scenes are per-context but the rasterizer is 1295fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * (potentially) shared, these empty scenes should be returned to 1305fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * the context which created them rather than retained here. 1315fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 13285ab6d2447784c417c705ec3c91be2893a801213Brian Paul /* struct lp_scene_queue *empty_scenes; */ 1332bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul 134663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /** The scene currently being rasterized by the threads */ 135663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *curr_scene; 1362bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul 1373a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul /** A task object for each rasterization thread */ 13839be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca struct lp_rasterizer_task tasks[LP_MAX_THREADS]; 139aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 140aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul unsigned num_threads; 14139be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca pipe_thread threads[LP_MAX_THREADS]; 142aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 1432bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul /** For synchronizing the rasterization threads */ 1442bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul pipe_barrier barrier; 145e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}; 146e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 147ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca 148d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwellvoid 149d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwelllp_rast_shade_quads_mask(struct lp_rasterizer_task *task, 150d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const struct lp_rast_shader_inputs *inputs, 151d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell unsigned x, unsigned y, 152d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell unsigned mask); 153d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 154ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca 1552797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1562797f2bf57562c95a601a67edca3089641215cc4Brian Paul/** 1570639765b2850739af1678f10fc0c5706d5827776Brian Paul * Get the pointer to a 4x4 depth/stencil block. 1580639765b2850739af1678f10fc0c5706d5827776Brian Paul * We'll map the z/stencil buffer on demand here. 1590639765b2850739af1678f10fc0c5706d5827776Brian Paul * Note that this may be called even when there's no z/stencil buffer - return 1600639765b2850739af1678f10fc0c5706d5827776Brian Paul * NULL in that case. 1615e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca * \param x, y location of 4x4 block in window coords 1625e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca */ 1635e6a9005100ec2636ce9734a5e4535216494cf60José Fonsecastatic INLINE void * 1642b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paullp_rast_get_depth_block_pointer(struct lp_rasterizer_task *task, 1650639765b2850739af1678f10fc0c5706d5827776Brian Paul unsigned x, unsigned y) 1665e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca{ 1672b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul const struct lp_rasterizer *rast = task->rast; 1680639765b2850739af1678f10fc0c5706d5827776Brian Paul void *depth; 1695fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 1705e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca assert((x % TILE_VECTOR_WIDTH) == 0); 1715e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca assert((y % TILE_VECTOR_HEIGHT) == 0); 1725fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 173e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell if (!rast->zsbuf.map) { 174e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell /* Either out of memory or no zsbuf. Can't tell without access 175e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell * to the state. Just use dummy tile memory, but don't print 176e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell * the oom warning as this most likely because there is no 177e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell * zsbuf. 178e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell */ 1792f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell return lp_dummy_tile; 1802b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul } 1815fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 1825fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell depth = (rast->zsbuf.map + 1835fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell rast->zsbuf.stride * y + 1845fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell rast->zsbuf.blocksize * x * TILE_VECTOR_HEIGHT); 1855fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 1865e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca assert(lp_check_alignment(depth, 16)); 1875e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca return depth; 1885e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca} 1895e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca 1905e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca 1910639765b2850739af1678f10fc0c5706d5827776Brian Paul/** 192d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Get pointer to the swizzled color tile 193d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 194d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwellstatic INLINE uint8_t * 195d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwelllp_rast_get_color_tile_pointer(struct lp_rasterizer_task *task, 196d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell unsigned buf, enum lp_texture_usage usage) 197d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell{ 198d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell struct lp_rasterizer *rast = task->rast; 199d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 200d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert(task->x % TILE_SIZE == 0); 201d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert(task->y % TILE_SIZE == 0); 202d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert(buf < rast->state.nr_cbufs); 203d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 204d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell if (!task->color_tiles[buf]) { 205d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell struct pipe_surface *cbuf = rast->curr_scene->fb.cbufs[buf]; 206d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell struct llvmpipe_resource *lpt; 207d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert(cbuf); 208d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell lpt = llvmpipe_resource(cbuf->texture); 2092f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell task->color_tiles[buf] = lp_swizzled_cbuf[task->thread_index][buf]; 2102f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell 2112f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell if (usage != LP_TEX_USAGE_WRITE_ALL) { 2122f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell llvmpipe_swizzle_cbuf_tile(lpt, 2132f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell cbuf->face + cbuf->zslice, 2142f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell cbuf->level, 2152f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell task->x, task->y, 2162f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell task->color_tiles[buf]); 217d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 218d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 219d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 220d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell return task->color_tiles[buf]; 221d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell} 222d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 223d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 224d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell/** 2250639765b2850739af1678f10fc0c5706d5827776Brian Paul * Get the pointer to a 4x4 color block (within a 64x64 tile). 2260639765b2850739af1678f10fc0c5706d5827776Brian Paul * We'll map the color buffer on demand here. 2270639765b2850739af1678f10fc0c5706d5827776Brian Paul * Note that this may be called even when there's no color buffers - return 2280639765b2850739af1678f10fc0c5706d5827776Brian Paul * NULL in that case. 2290639765b2850739af1678f10fc0c5706d5827776Brian Paul * \param x, y location of 4x4 block in window coords 2300639765b2850739af1678f10fc0c5706d5827776Brian Paul */ 2310639765b2850739af1678f10fc0c5706d5827776Brian Paulstatic INLINE uint8_t * 2320639765b2850739af1678f10fc0c5706d5827776Brian Paullp_rast_get_color_block_pointer(struct lp_rasterizer_task *task, 2330639765b2850739af1678f10fc0c5706d5827776Brian Paul unsigned buf, unsigned x, unsigned y) 2340639765b2850739af1678f10fc0c5706d5827776Brian Paul{ 2350639765b2850739af1678f10fc0c5706d5827776Brian Paul unsigned px, py, pixel_offset; 2360639765b2850739af1678f10fc0c5706d5827776Brian Paul uint8_t *color; 2370639765b2850739af1678f10fc0c5706d5827776Brian Paul 2380639765b2850739af1678f10fc0c5706d5827776Brian Paul assert((x % TILE_VECTOR_WIDTH) == 0); 2390639765b2850739af1678f10fc0c5706d5827776Brian Paul assert((y % TILE_VECTOR_HEIGHT) == 0); 2400639765b2850739af1678f10fc0c5706d5827776Brian Paul 241d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell color = lp_rast_get_color_tile_pointer(task, buf, LP_TEX_USAGE_READ_WRITE); 2422f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell assert(color); 2430639765b2850739af1678f10fc0c5706d5827776Brian Paul 2440639765b2850739af1678f10fc0c5706d5827776Brian Paul px = x % TILE_SIZE; 2450639765b2850739af1678f10fc0c5706d5827776Brian Paul py = y % TILE_SIZE; 2460639765b2850739af1678f10fc0c5706d5827776Brian Paul pixel_offset = tile_pixel_offset(px, py, 0); 2470639765b2850739af1678f10fc0c5706d5827776Brian Paul 2480639765b2850739af1678f10fc0c5706d5827776Brian Paul color = color + pixel_offset; 2490639765b2850739af1678f10fc0c5706d5827776Brian Paul 2500639765b2850739af1678f10fc0c5706d5827776Brian Paul assert(lp_check_alignment(color, 16)); 2510639765b2850739af1678f10fc0c5706d5827776Brian Paul return color; 2520639765b2850739af1678f10fc0c5706d5827776Brian Paul} 2530639765b2850739af1678f10fc0c5706d5827776Brian Paul 2540639765b2850739af1678f10fc0c5706d5827776Brian Paul 2555e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca 2565e6a9005100ec2636ce9734a5e4535216494cf60José Fonseca/** 2572797f2bf57562c95a601a67edca3089641215cc4Brian Paul * Shade all pixels in a 4x4 block. The fragment code omits the 2582797f2bf57562c95a601a67edca3089641215cc4Brian Paul * triangle in/out tests. 2592797f2bf57562c95a601a67edca3089641215cc4Brian Paul * \param x, y location of 4x4 block in window coords 2602797f2bf57562c95a601a67edca3089641215cc4Brian Paul */ 2612797f2bf57562c95a601a67edca3089641215cc4Brian Paulstatic INLINE void 2621c9db3c57f1538e21b839df0989b958be3465a36Brian Paullp_rast_shade_quads_all( struct lp_rasterizer_task *task, 2632797f2bf57562c95a601a67edca3089641215cc4Brian Paul const struct lp_rast_shader_inputs *inputs, 2642797f2bf57562c95a601a67edca3089641215cc4Brian Paul unsigned x, unsigned y ) 2652797f2bf57562c95a601a67edca3089641215cc4Brian Paul{ 2662b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul const struct lp_rasterizer *rast = task->rast; 267e21e7ab4da859198dfa9845b4a7207c49db54771Keith Whitwell const struct lp_rast_state *state = inputs->state; 26818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca struct lp_fragment_shader_variant *variant = state->variant; 2692797f2bf57562c95a601a67edca3089641215cc4Brian Paul uint8_t *color[PIPE_MAX_COLOR_BUFS]; 2702797f2bf57562c95a601a67edca3089641215cc4Brian Paul void *depth; 2710639765b2850739af1678f10fc0c5706d5827776Brian Paul unsigned i; 2722797f2bf57562c95a601a67edca3089641215cc4Brian Paul 2732797f2bf57562c95a601a67edca3089641215cc4Brian Paul /* color buffer */ 2745fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell for (i = 0; i < rast->state.nr_cbufs; i++) 2750639765b2850739af1678f10fc0c5706d5827776Brian Paul color[i] = lp_rast_get_color_block_pointer(task, i, x, y); 2760639765b2850739af1678f10fc0c5706d5827776Brian Paul 2772b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul depth = lp_rast_get_depth_block_pointer(task, x, y); 2780639765b2850739af1678f10fc0c5706d5827776Brian Paul 2790639765b2850739af1678f10fc0c5706d5827776Brian Paul /* run shader on 4x4 block */ 2806c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul BEGIN_JIT_CALL(state); 28118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca variant->jit_function[RAST_WHOLE]( &state->jit_context, 282d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell x, y, 283d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inputs->facing, 284d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inputs->a0, 285d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inputs->dadx, 286d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inputs->dady, 287d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell color, 288d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell depth, 289d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 0xffff, 290d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell &task->vis_counter ); 2916c1625cc405f0d77523c122cedf3e8003f2aa7bfBrian Paul END_JIT_CALL(); 2922797f2bf57562c95a601a67edca3089641215cc4Brian Paul} 2932797f2bf57562c95a601a67edca3089641215cc4Brian Paul 2942797f2bf57562c95a601a67edca3089641215cc4Brian Paul 295e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell#endif 296