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