lp_rast_priv.h revision 2797f2bf57562c95a601a67edca3089641215cc4
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 31aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul#include "pipe/p_thread.h" 32e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell#include "lp_rast.h" 332797f2bf57562c95a601a67edca3089641215cc4Brian Paul#include "lp_tile_soa.h" 34e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 353a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 367f457acabcbeea6a27b4f375f55e318fff52445fJosé Fonseca#define MAX_THREADS 8 /* XXX probably temporary here */ 373a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 383a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 39e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwellstruct pipe_transfer; 40e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwellstruct pipe_screen; 41aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paulstruct lp_rasterizer; 42a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca 43a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul 44a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul/** 45a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul * A tile's color and depth memory. 46a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul * We can choose whatever layout for the internal tile storage we prefer. 47a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca */ 48a6676d896ed18426ed3d7e6340347974c1694ca2José Fonsecastruct lp_rast_tile 49a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca{ 50c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell uint8_t *color[PIPE_MAX_COLOR_BUFS]; 51a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca 52ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca uint32_t *depth; 53a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca}; 54a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca 55a6676d896ed18426ed3d7e6340347974c1694ca2José Fonseca 56a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul/** 573a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * Per-thread rasterization state 58a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul */ 593a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paulstruct lp_rasterizer_task 60a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul{ 61a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul struct lp_rast_tile tile; /** Tile color/z/stencil memory */ 62e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 63a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul unsigned x, y; /**< Pos of this tile in framebuffer, in pixels */ 643a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 653a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul const struct lp_rast_state *current_state; 66aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 67aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul /** "back" pointer */ 68aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul struct lp_rasterizer *rast; 69aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 70aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul /** "my" index */ 71aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul unsigned thread_index; 72aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 73aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul pipe_semaphore work_ready; 74aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul pipe_semaphore work_done; 753a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul}; 763a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 773a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul 783a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul/** 793a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * This is the state required while rasterizing tiles. 803a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * Note that this contains per-thread information too. 813a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul * The tile size is TILE_SIZE x TILE_SIZE pixels. 823a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul */ 833a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paulstruct lp_rasterizer 843a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul{ 8584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell boolean clipped_tile; 8684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell boolean check_for_clipped_tiles; 87e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell 88a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul /* Framebuffer stuff 89a9be9cd8be0fac4be5d65430749666d2204b79a4Brian Paul */ 90e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell struct pipe_screen *screen; 91c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell struct pipe_transfer *cbuf_transfer[PIPE_MAX_COLOR_BUFS]; 92e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell struct pipe_transfer *zsbuf_transfer; 93c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell void *cbuf_map[PIPE_MAX_COLOR_BUFS]; 94e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell void *zsbuf_map; 95e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell 96e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell struct { 97156eabbaf996f471458ee2a69078674277b89067Brian Paul struct pipe_framebuffer_state fb; 9847510040a68f5f672aee22eac6c01fb4dd60ec67José Fonseca boolean write_color; 9947510040a68f5f672aee22eac6c01fb4dd60ec67José Fonseca boolean write_zstencil; 100e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell unsigned clear_color; 101e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell unsigned clear_depth; 102e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell char clear_stencil; 103e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell } state; 1043199c6e764c20c69a76c561b9f4b89a23e5a97f5Keith Whitwell 105663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /** The incoming queue of scenes ready to rasterize */ 106663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene_queue *full_scenes; 107663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /** The outgoing queue of processed scenes to return to setup modulee */ 108663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene_queue *empty_scenes; 1092bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul 110663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /** The scene currently being rasterized by the threads */ 111663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *curr_scene; 1122bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul 1133a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul /** A task object for each rasterization thread */ 1143a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul struct lp_rasterizer_task tasks[MAX_THREADS]; 115aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 116aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul unsigned num_threads; 117aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul pipe_thread threads[MAX_THREADS]; 118aab1ceceecbd6449eebce7f5f5b356b1a51552e7Brian Paul 1192bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul /** For synchronizing the rasterization threads */ 1202bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul pipe_barrier barrier; 121e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}; 122e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 123ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca 124ab76b2a8b896edc1e972de108d044b70310b4324José Fonsecavoid lp_rast_shade_quads( struct lp_rasterizer *rast, 1253a06c113c76355fc9622adfe7565c18d9787e9a8Brian Paul unsigned thread_index, 126ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca const struct lp_rast_shader_inputs *inputs, 127ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca unsigned x, unsigned y, 128ab9438193083b7f9a3180cb9cea45e269131048aBrian Paul int32_t c1, int32_t c2, int32_t c3); 129ab76b2a8b896edc1e972de108d044b70310b4324José Fonseca 1302797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1312797f2bf57562c95a601a67edca3089641215cc4Brian Paul/** 1322797f2bf57562c95a601a67edca3089641215cc4Brian Paul * Shade all pixels in a 4x4 block. The fragment code omits the 1332797f2bf57562c95a601a67edca3089641215cc4Brian Paul * triangle in/out tests. 1342797f2bf57562c95a601a67edca3089641215cc4Brian Paul * \param x, y location of 4x4 block in window coords 1352797f2bf57562c95a601a67edca3089641215cc4Brian Paul */ 1362797f2bf57562c95a601a67edca3089641215cc4Brian Paulstatic INLINE void 1372797f2bf57562c95a601a67edca3089641215cc4Brian Paullp_rast_shade_quads_all( struct lp_rasterizer *rast, 1382797f2bf57562c95a601a67edca3089641215cc4Brian Paul unsigned thread_index, 1392797f2bf57562c95a601a67edca3089641215cc4Brian Paul const struct lp_rast_shader_inputs *inputs, 1402797f2bf57562c95a601a67edca3089641215cc4Brian Paul unsigned x, unsigned y ) 1412797f2bf57562c95a601a67edca3089641215cc4Brian Paul{ 1422797f2bf57562c95a601a67edca3089641215cc4Brian Paul const struct lp_rast_state *state = rast->tasks[thread_index].current_state; 1432797f2bf57562c95a601a67edca3089641215cc4Brian Paul struct lp_rast_tile *tile = &rast->tasks[thread_index].tile; 1442797f2bf57562c95a601a67edca3089641215cc4Brian Paul const unsigned ix = x % TILE_SIZE, iy = y % TILE_SIZE; 1452797f2bf57562c95a601a67edca3089641215cc4Brian Paul uint8_t *color[PIPE_MAX_COLOR_BUFS]; 1462797f2bf57562c95a601a67edca3089641215cc4Brian Paul void *depth; 1472797f2bf57562c95a601a67edca3089641215cc4Brian Paul unsigned block_offset, i; 1482797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1492797f2bf57562c95a601a67edca3089641215cc4Brian Paul /* offset of the containing 16x16 pixel block within the tile */ 1502797f2bf57562c95a601a67edca3089641215cc4Brian Paul block_offset = (iy / 4) * (16 * 16) + (ix / 4) * 16; 1512797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1522797f2bf57562c95a601a67edca3089641215cc4Brian Paul /* color buffer */ 1532797f2bf57562c95a601a67edca3089641215cc4Brian Paul for (i = 0; i < rast->state.fb.nr_cbufs; i++) 1542797f2bf57562c95a601a67edca3089641215cc4Brian Paul color[i] = tile->color[i] + 4 * block_offset; 1552797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1562797f2bf57562c95a601a67edca3089641215cc4Brian Paul /* depth buffer */ 1572797f2bf57562c95a601a67edca3089641215cc4Brian Paul depth = tile->depth + block_offset; 1582797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1592797f2bf57562c95a601a67edca3089641215cc4Brian Paul /* run shader */ 1602797f2bf57562c95a601a67edca3089641215cc4Brian Paul state->jit_function[0]( &state->jit_context, 1612797f2bf57562c95a601a67edca3089641215cc4Brian Paul x, y, 1622797f2bf57562c95a601a67edca3089641215cc4Brian Paul inputs->a0, 1632797f2bf57562c95a601a67edca3089641215cc4Brian Paul inputs->dadx, 1642797f2bf57562c95a601a67edca3089641215cc4Brian Paul inputs->dady, 1652797f2bf57562c95a601a67edca3089641215cc4Brian Paul color, 1662797f2bf57562c95a601a67edca3089641215cc4Brian Paul depth, 1672797f2bf57562c95a601a67edca3089641215cc4Brian Paul INT_MIN, INT_MIN, INT_MIN, 1682797f2bf57562c95a601a67edca3089641215cc4Brian Paul NULL, NULL, NULL ); 1692797f2bf57562c95a601a67edca3089641215cc4Brian Paul} 1702797f2bf57562c95a601a67edca3089641215cc4Brian Paul 1712797f2bf57562c95a601a67edca3089641215cc4Brian Paul 172e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell#endif 173