Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. //struct dd_function_table;
  2. /**************************************************************************
  3.  *
  4.  * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
  5.  * All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the
  9.  * "Software"), to deal in the Software without restriction, including
  10.  * without limitation the rights to use, copy, modify, merge, publish,
  11.  * distribute, sub license, and/or sell copies of the Software, and to
  12.  * permit persons to whom the Software is furnished to do so, subject to
  13.  * the following conditions:
  14.  *
  15.  * The above copyright notice and this permission notice (including the
  16.  * next paragraph) shall be included in all copies or substantial portions
  17.  * of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  21.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  22.  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  23.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  24.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  25.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26.  *
  27.  **************************************************************************/
  28.  
  29. #ifndef ST_CONTEXT_H
  30. #define ST_CONTEXT_H
  31.  
  32. #include "main/mtypes.h"
  33. #include "pipe/p_state.h"
  34. #include "state_tracker/st_api.h"
  35.  
  36. struct bitmap_cache;
  37. struct blit_state;
  38. struct dd_function_table;
  39. struct draw_context;
  40. struct draw_stage;
  41. struct gen_mipmap_state;
  42. struct st_context;
  43. struct st_fragment_program;
  44.  
  45.  
  46. #define ST_NEW_MESA                    0x1 /* Mesa state has changed */
  47. #define ST_NEW_FRAGMENT_PROGRAM        0x2
  48. #define ST_NEW_VERTEX_PROGRAM          0x4
  49. #define ST_NEW_FRAMEBUFFER             0x8
  50. #define ST_NEW_EDGEFLAGS_DATA          0x10
  51. #define ST_NEW_GEOMETRY_PROGRAM        0x20
  52.  
  53.  
  54. struct st_state_flags {
  55.    GLuint mesa;
  56.    GLuint st;
  57. };
  58.  
  59. struct st_tracked_state {
  60.    const char *name;
  61.    struct st_state_flags dirty;
  62.    void (*update)( struct st_context *st );
  63. };
  64.  
  65.  
  66.  
  67. struct st_context
  68. {
  69.    struct st_context_iface iface;
  70.  
  71.    struct gl_context *ctx;
  72.  
  73.    struct pipe_context *pipe;
  74.  
  75.    struct draw_context *draw;  /**< For selection/feedback/rastpos only */
  76.    struct draw_stage *feedback_stage;  /**< For GL_FEEDBACK rendermode */
  77.    struct draw_stage *selection_stage;  /**< For GL_SELECT rendermode */
  78.    struct draw_stage *rastpos_stage;  /**< For glRasterPos */
  79.  
  80.  
  81.    /* On old libGL's for linux we need to invalidate the drawables
  82.     * on glViewpport calls, this is set via a option.
  83.     */
  84.    boolean invalidate_on_gl_viewport;
  85.  
  86.    /* Some state is contained in constant objects.
  87.     * Other state is just parameter values.
  88.     */
  89.    struct {
  90.       struct pipe_blend_state               blend;
  91.       struct pipe_depth_stencil_alpha_state depth_stencil;
  92.       struct pipe_rasterizer_state          rasterizer;
  93.       struct pipe_sampler_state             samplers[PIPE_MAX_SAMPLERS];
  94.       struct pipe_sampler_state             *sampler_list[PIPE_MAX_SAMPLERS];
  95.       struct pipe_clip_state clip;
  96.       struct pipe_resource *constants[PIPE_SHADER_TYPES];
  97.       struct pipe_framebuffer_state framebuffer;
  98.       struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
  99.       struct pipe_scissor_state scissor;
  100.       struct pipe_viewport_state viewport;
  101.       unsigned sample_mask;
  102.  
  103.       GLuint num_samplers;
  104.       GLuint num_textures;
  105.  
  106.       GLuint poly_stipple[32];  /**< In OpenGL's bottom-to-top order */
  107.    } state;
  108.  
  109.    struct {
  110.       struct st_tracked_state tracked_state[PIPE_SHADER_TYPES];
  111.    } constants;
  112.  
  113.    /* XXX unused: */
  114.    struct {
  115.       struct gl_fragment_program *fragment_program;
  116.    } cb;
  117.  
  118.    char vendor[100];
  119.    char renderer[100];
  120.  
  121.    struct st_state_flags dirty;
  122.  
  123.    GLboolean missing_textures;
  124.    GLboolean vertdata_edgeflags;
  125.  
  126.    /** Mapping from VERT_RESULT_x to post-transformed vertex slot */
  127.    const GLuint *vertex_result_to_slot;
  128.  
  129.    struct st_vertex_program *vp;    /**< Currently bound vertex program */
  130.    struct st_fragment_program *fp;  /**< Currently bound fragment program */
  131.    struct st_geometry_program *gp;  /**< Currently bound geometry program */
  132.  
  133.    struct st_vp_varient *vp_varient;
  134.  
  135.    struct gl_texture_object *default_texture;
  136.  
  137.    struct {
  138.       struct gl_program_cache *cache;
  139.       struct st_fragment_program *program;  /**< cur pixel transfer prog */
  140.       GLuint xfer_prog_sn;  /**< pixel xfer program serial no. */
  141.       GLuint user_prog_sn;  /**< user fragment program serial no. */
  142.       struct st_fragment_program *combined_prog;
  143.       GLuint combined_prog_sn;
  144.       struct pipe_resource *pixelmap_texture;
  145.       struct pipe_sampler_view *pixelmap_sampler_view;
  146.       boolean pixelmap_enabled;  /**< use the pixelmap texture? */
  147.    } pixel_xfer;
  148.  
  149.    /** for glBitmap */
  150.    struct {
  151.       struct pipe_rasterizer_state rasterizer;
  152.       struct pipe_sampler_state samplers[2];
  153.       enum pipe_format tex_format;
  154.       void *vs;
  155.       float vertices[4][3][4];  /**< vertex pos + color + texcoord */
  156.       struct pipe_resource *vbuf;
  157.       unsigned vbuf_slot;       /* next free slot in vbuf */
  158.       struct bitmap_cache *cache;
  159.    } bitmap;
  160.  
  161.    /** for glDraw/CopyPixels */
  162.    struct {
  163.       struct st_fragment_program *shaders[4];
  164.       void *vert_shaders[2];   /**< ureg shaders */
  165.    } drawpix;
  166.  
  167.    /** for glClear */
  168.    struct {
  169.       struct pipe_rasterizer_state raster;
  170.       struct pipe_viewport_state viewport;
  171.       struct pipe_clip_state clip;
  172.       void *vs;
  173.       void *fs;
  174.       float vertices[4][2][4];  /**< vertex pos + color */
  175.       struct pipe_resource *vbuf;
  176.       unsigned vbuf_slot;
  177.       boolean enable_ds_separate;
  178.    } clear;
  179.  
  180.    /** used for anything using util_draw_vertex_buffer */
  181.    struct pipe_vertex_element velems_util_draw[3];
  182.  
  183.    void *passthrough_fs;  /**< simple pass-through frag shader */
  184.  
  185.    enum pipe_texture_target internal_target;
  186.    struct gen_mipmap_state *gen_mipmap;
  187.    struct blit_state *blit;
  188.  
  189.    struct cso_context *cso_context;
  190.  
  191.    int force_msaa;
  192.    void *winsys_drawable_handle;
  193. };
  194.  
  195.  
  196. /* Need this so that we can implement Mesa callbacks in this module.
  197.  */
  198. static INLINE struct st_context *st_context(struct gl_context *ctx)
  199. {
  200.    return ctx->st;
  201. }
  202.  
  203.  
  204. /**
  205.  * Wrapper for struct gl_framebuffer.
  206.  * This is an opaque type to the outside world.
  207.  */
  208. struct st_framebuffer
  209. {
  210.    struct gl_framebuffer Base;
  211.    void *Private;
  212.  
  213.    struct st_framebuffer_iface *iface;
  214.    enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
  215.    unsigned num_statts;
  216.    int32_t revalidate;
  217. };
  218.  
  219.  
  220. extern void st_init_driver_functions(struct dd_function_table *functions);
  221.  
  222. void st_invalidate_state(struct gl_context * ctx, GLuint new_state);
  223.  
  224.  
  225.  
  226. #define Y_0_TOP 1
  227. #define Y_0_BOTTOM 2
  228.  
  229. static INLINE GLuint
  230. st_fb_orientation(const struct gl_framebuffer *fb)
  231. {
  232.    if (fb && fb->Name == 0) {
  233.       /* Drawing into a window (on-screen buffer).
  234.        *
  235.        * Negate Y scale to flip image vertically.
  236.        * The NDC Y coords prior to viewport transformation are in the range
  237.        * [y=-1=bottom, y=1=top]
  238.        * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where
  239.        * H is the window height.
  240.        * Use the viewport transformation to invert Y.
  241.        */
  242.       return Y_0_TOP;
  243.    }
  244.    else {
  245.       /* Drawing into user-created FBO (very likely a texture).
  246.        *
  247.        * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering.
  248.        */
  249.       return Y_0_BOTTOM;
  250.    }
  251. }
  252.  
  253.  
  254. /** clear-alloc a struct-sized object, with casting */
  255. #define ST_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
  256.  
  257.  
  258. extern int
  259. st_get_msaa(void);
  260.  
  261. extern struct st_context *
  262. st_create_context(gl_api api, struct pipe_context *pipe,
  263.                   const struct gl_config *visual,
  264.                   struct st_context *share);
  265.  
  266. extern void
  267. st_destroy_context(struct st_context *st);
  268.  
  269.  
  270. #endif
  271.