Home | History | Annotate | Download | only in swr
      1 /****************************************************************************
      2  * Copyright (C) 2015 Intel Corporation.   All Rights Reserved.
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  ***************************************************************************/
     23 
     24 #ifndef SWR_CONTEXT_H
     25 #define SWR_CONTEXT_H
     26 
     27 #include "common/os.h"
     28 
     29 #include "pipe/p_context.h"
     30 #include "pipe/p_state.h"
     31 #include "util/u_blitter.h"
     32 #include "jit_api.h"
     33 #include "swr_state.h"
     34 #include <unordered_map>
     35 
     36 #define SWR_NEW_BLEND (1 << 0)
     37 #define SWR_NEW_RASTERIZER (1 << 1)
     38 #define SWR_NEW_DEPTH_STENCIL_ALPHA (1 << 2)
     39 #define SWR_NEW_SAMPLER (1 << 3)
     40 #define SWR_NEW_SAMPLER_VIEW (1 << 4)
     41 #define SWR_NEW_VS (1 << 5)
     42 #define SWR_NEW_FS (1 << 6)
     43 #define SWR_NEW_VSCONSTANTS (1 << 7)
     44 #define SWR_NEW_FSCONSTANTS (1 << 8)
     45 #define SWR_NEW_VERTEX (1 << 9)
     46 #define SWR_NEW_STIPPLE (1 << 10)
     47 #define SWR_NEW_SCISSOR (1 << 11)
     48 #define SWR_NEW_VIEWPORT (1 << 12)
     49 #define SWR_NEW_FRAMEBUFFER (1 << 13)
     50 #define SWR_NEW_CLIP (1 << 14)
     51 #define SWR_NEW_SO (1 << 15)
     52 #define SWR_NEW_ALL 0x0000ffff
     53 
     54 namespace std
     55 {
     56 template <> struct hash<BLEND_COMPILE_STATE> {
     57    std::size_t operator()(const BLEND_COMPILE_STATE &k) const
     58    {
     59       return util_hash_crc32(&k, sizeof(k));
     60    }
     61 };
     62 };
     63 
     64 struct swr_jit_texture {
     65    uint32_t width; // same as number of elements
     66    uint32_t height;
     67    uint32_t depth; // doubles as array size
     68    uint32_t first_level;
     69    uint32_t last_level;
     70    const uint8_t *base_ptr;
     71    uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
     72    uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
     73    uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
     74 };
     75 
     76 struct swr_jit_sampler {
     77    float min_lod;
     78    float max_lod;
     79    float lod_bias;
     80    float border_color[4];
     81 };
     82 
     83 struct swr_draw_context {
     84    const float *constantVS[PIPE_MAX_CONSTANT_BUFFERS];
     85    uint32_t num_constantsVS[PIPE_MAX_CONSTANT_BUFFERS];
     86    const float *constantFS[PIPE_MAX_CONSTANT_BUFFERS];
     87    uint32_t num_constantsFS[PIPE_MAX_CONSTANT_BUFFERS];
     88 
     89    swr_jit_texture texturesVS[PIPE_MAX_SHADER_SAMPLER_VIEWS];
     90    swr_jit_sampler samplersVS[PIPE_MAX_SAMPLERS];
     91    swr_jit_texture texturesFS[PIPE_MAX_SHADER_SAMPLER_VIEWS];
     92    swr_jit_sampler samplersFS[PIPE_MAX_SAMPLERS];
     93 
     94    float userClipPlanes[PIPE_MAX_CLIP_PLANES][4];
     95 
     96    SWR_SURFACE_STATE renderTargets[SWR_NUM_ATTACHMENTS];
     97    void *pStats;
     98 };
     99 
    100 /* gen_llvm_types FINI */
    101 
    102 struct swr_context {
    103    struct pipe_context pipe; /**< base class */
    104 
    105    HANDLE swrContext;
    106 
    107    /** Constant state objects */
    108    struct swr_blend_state *blend;
    109    struct pipe_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
    110    struct pipe_depth_stencil_alpha_state *depth_stencil;
    111    struct pipe_rasterizer_state *rasterizer;
    112 
    113    struct swr_vertex_shader *vs;
    114    struct swr_fragment_shader *fs;
    115    struct swr_vertex_element_state *velems;
    116 
    117    /** Other rendering state */
    118    struct pipe_blend_color blend_color;
    119    struct pipe_stencil_ref stencil_ref;
    120    struct pipe_clip_state clip;
    121    struct pipe_constant_buffer
    122       constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
    123    struct pipe_framebuffer_state framebuffer;
    124    struct pipe_poly_stipple poly_stipple;
    125    struct pipe_scissor_state scissor;
    126    SWR_RECT swr_scissor;
    127    struct pipe_sampler_view *
    128       sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS];
    129 
    130    struct pipe_viewport_state viewport;
    131    struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
    132    struct pipe_index_buffer index_buffer;
    133 
    134    struct blitter_context *blitter;
    135 
    136    /** Conditional query object and mode */
    137    struct pipe_query *render_cond_query;
    138    uint render_cond_mode;
    139    boolean render_cond_cond;
    140    unsigned active_queries;
    141 
    142    unsigned num_vertex_buffers;
    143    unsigned num_samplers[PIPE_SHADER_TYPES];
    144    unsigned num_sampler_views[PIPE_SHADER_TYPES];
    145 
    146    unsigned sample_mask;
    147 
    148    // streamout
    149    pipe_stream_output_target *so_targets[MAX_SO_STREAMS];
    150    uint32_t num_so_targets;
    151 
    152    /* Temp storage for user_buffer constants */
    153    struct swr_scratch_buffers *scratch;
    154 
    155    // blend jit functions
    156    std::unordered_map<BLEND_COMPILE_STATE, PFN_BLEND_JIT_FUNC> *blendJIT;
    157 
    158    /* Derived SWR API DrawState */
    159    struct swr_derived_state derived;
    160 
    161    /* SWR private state - draw context */
    162    struct swr_draw_context swrDC;
    163 
    164    unsigned dirty; /**< Mask of SWR_NEW_x flags */
    165 };
    166 
    167 static INLINE struct swr_context *
    168 swr_context(struct pipe_context *pipe)
    169 {
    170    return (struct swr_context *)pipe;
    171 }
    172 
    173 static INLINE void
    174 swr_update_draw_context(struct swr_context *ctx,
    175       struct swr_query_result *pqr = nullptr)
    176 {
    177    swr_draw_context *pDC =
    178       (swr_draw_context *)SwrGetPrivateContextState(ctx->swrContext);
    179    if (pqr)
    180       ctx->swrDC.pStats = pqr;
    181    memcpy(pDC, &ctx->swrDC, sizeof(swr_draw_context));
    182 }
    183 
    184 struct pipe_context *swr_create_context(struct pipe_screen *, void *priv, unsigned flags);
    185 
    186 void swr_state_init(struct pipe_context *pipe);
    187 
    188 void swr_clear_init(struct pipe_context *pipe);
    189 
    190 void swr_draw_init(struct pipe_context *pipe);
    191 
    192 void swr_finish(struct pipe_context *pipe);
    193 #endif
    194