Subversion Repositories Kolibri OS

Rev

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

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