Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2003 VMware, Inc.
  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 VMWARE 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.  
  37. #ifdef __cplusplus
  38. extern "C" {
  39. #endif
  40.  
  41.  
  42. struct bitmap_cache;
  43. struct dd_function_table;
  44. struct draw_context;
  45. struct draw_stage;
  46. struct gen_mipmap_state;
  47. struct st_context;
  48. struct st_fragment_program;
  49. struct u_upload_mgr;
  50.  
  51.  
  52. #define ST_NEW_MESA                    (1 << 0) /* Mesa state has changed */
  53. #define ST_NEW_FRAGMENT_PROGRAM        (1 << 1)
  54. #define ST_NEW_VERTEX_PROGRAM          (1 << 2)
  55. #define ST_NEW_FRAMEBUFFER             (1 << 3)
  56. /* gap, re-use it */
  57. #define ST_NEW_GEOMETRY_PROGRAM        (1 << 5)
  58. #define ST_NEW_VERTEX_ARRAYS           (1 << 6)
  59. #define ST_NEW_RASTERIZER              (1 << 7)
  60. #define ST_NEW_UNIFORM_BUFFER          (1 << 8)
  61.  
  62.  
  63. struct st_state_flags {
  64.    GLuint mesa;
  65.    uint64_t st;
  66. };
  67.  
  68. struct st_tracked_state {
  69.    const char *name;
  70.    struct st_state_flags dirty;
  71.    void (*update)( struct st_context *st );
  72. };
  73.  
  74.  
  75.  
  76. struct st_context
  77. {
  78.    struct st_context_iface iface;
  79.  
  80.    struct gl_context *ctx;
  81.  
  82.    struct pipe_context *pipe;
  83.  
  84.    struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader;
  85.  
  86.    struct draw_context *draw;  /**< For selection/feedback/rastpos only */
  87.    struct draw_stage *feedback_stage;  /**< For GL_FEEDBACK rendermode */
  88.    struct draw_stage *selection_stage;  /**< For GL_SELECT rendermode */
  89.    struct draw_stage *rastpos_stage;  /**< For glRasterPos */
  90.    GLboolean clamp_frag_color_in_shader;
  91.    GLboolean clamp_vert_color_in_shader;
  92.    boolean has_stencil_export; /**< can do shader stencil export? */
  93.    boolean has_time_elapsed;
  94.    boolean has_shader_model3;
  95.    boolean has_etc1;
  96.    boolean has_etc2;
  97.    boolean prefer_blit_based_texture_transfer;
  98.  
  99.    boolean needs_texcoord_semantic;
  100.    boolean apply_texture_swizzle_to_border_color;
  101.  
  102.    /* On old libGL's for linux we need to invalidate the drawables
  103.     * on glViewpport calls, this is set via a option.
  104.     */
  105.    boolean invalidate_on_gl_viewport;
  106.  
  107.    boolean vertex_array_out_of_memory;
  108.  
  109.    /* Some state is contained in constant objects.
  110.     * Other state is just parameter values.
  111.     */
  112.    struct {
  113.       struct pipe_blend_state               blend;
  114.       struct pipe_depth_stencil_alpha_state depth_stencil;
  115.       struct pipe_rasterizer_state          rasterizer;
  116.       struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
  117.       GLuint num_samplers[PIPE_SHADER_TYPES];
  118.       struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
  119.       GLuint num_sampler_views[PIPE_SHADER_TYPES];
  120.       struct pipe_clip_state clip;
  121.       struct {
  122.          void *ptr;
  123.          unsigned size;
  124.       } constants[PIPE_SHADER_TYPES];
  125.       struct pipe_framebuffer_state framebuffer;
  126.       struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS];
  127.       struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS];
  128.       unsigned sample_mask;
  129.  
  130.       GLuint poly_stipple[32];  /**< In OpenGL's bottom-to-top order */
  131.  
  132.       GLuint fb_orientation;
  133.    } state;
  134.  
  135.    char vendor[100];
  136.    char renderer[100];
  137.  
  138.    struct st_state_flags dirty;
  139.  
  140.    GLboolean missing_textures;
  141.    GLboolean vertdata_edgeflags;
  142.    GLboolean edgeflag_culls_prims;
  143.  
  144.    /** Mapping from VARYING_SLOT_x to post-transformed vertex slot */
  145.    const GLuint *vertex_result_to_slot;
  146.  
  147.    struct st_vertex_program *vp;    /**< Currently bound vertex program */
  148.    struct st_fragment_program *fp;  /**< Currently bound fragment program */
  149.    struct st_geometry_program *gp;  /**< Currently bound geometry program */
  150.  
  151.    struct st_vp_variant *vp_variant;
  152.    struct st_fp_variant *fp_variant;
  153.    struct st_gp_variant *gp_variant;
  154.  
  155.    struct gl_texture_object *default_texture;
  156.  
  157.    struct {
  158.       struct gl_program_cache *cache;
  159.       struct st_fragment_program *program;  /**< cur pixel transfer prog */
  160.       GLuint xfer_prog_sn;  /**< pixel xfer program serial no. */
  161.       GLuint user_prog_sn;  /**< user fragment program serial no. */
  162.       struct st_fragment_program *combined_prog;
  163.       GLuint combined_prog_sn;
  164.       struct pipe_resource *pixelmap_texture;
  165.       struct pipe_sampler_view *pixelmap_sampler_view;
  166.       boolean pixelmap_enabled;  /**< use the pixelmap texture? */
  167.    } pixel_xfer;
  168.  
  169.    /** for glBitmap */
  170.    struct {
  171.       struct pipe_rasterizer_state rasterizer;
  172.       struct pipe_sampler_state samplers[2];
  173.       enum pipe_format tex_format;
  174.       void *vs;
  175.       struct bitmap_cache *cache;
  176.    } bitmap;
  177.  
  178.    /** for glDraw/CopyPixels */
  179.    struct {
  180.       struct gl_fragment_program *shaders[4];
  181.       void *vert_shaders[2];   /**< ureg shaders */
  182.    } drawpix;
  183.  
  184.    /** for glClear */
  185.    struct {
  186.       struct pipe_rasterizer_state raster;
  187.       struct pipe_viewport_state viewport;
  188.       void *vs;
  189.       void *fs;
  190.       void *vs_layered;
  191.       void *gs_layered;
  192.    } clear;
  193.  
  194.    /** used for anything using util_draw_vertex_buffer */
  195.    struct pipe_vertex_element velems_util_draw[3];
  196.  
  197.    void *passthrough_fs;  /**< simple pass-through frag shader */
  198.  
  199.    enum pipe_texture_target internal_target;
  200.  
  201.    struct cso_context *cso_context;
  202.  
  203.    void *winsys_drawable_handle;
  204.  
  205.    /* The number of vertex buffers from the last call of validate_arrays. */
  206.    unsigned last_num_vbuffers;
  207.  
  208.    int32_t draw_stamp;
  209.    int32_t read_stamp;
  210.  
  211.    struct st_config_options options;
  212. };
  213.  
  214.  
  215. /* Need this so that we can implement Mesa callbacks in this module.
  216.  */
  217. static inline struct st_context *st_context(struct gl_context *ctx)
  218. {
  219.    return ctx->st;
  220. }
  221.  
  222.  
  223. /**
  224.  * Wrapper for struct gl_framebuffer.
  225.  * This is an opaque type to the outside world.
  226.  */
  227. struct st_framebuffer
  228. {
  229.    struct gl_framebuffer Base;
  230.    void *Private;
  231.  
  232.    struct st_framebuffer_iface *iface;
  233.    enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
  234.    unsigned num_statts;
  235.    int32_t stamp;
  236.    int32_t iface_stamp;
  237. };
  238.  
  239.  
  240. extern void st_init_driver_functions(struct pipe_screen *screen,
  241.                                      struct dd_function_table *functions);
  242.  
  243. void st_invalidate_state(struct gl_context * ctx, GLuint new_state);
  244.  
  245.  
  246.  
  247. #define Y_0_TOP 1
  248. #define Y_0_BOTTOM 2
  249.  
  250. static inline GLuint
  251. st_fb_orientation(const struct gl_framebuffer *fb)
  252. {
  253.    if (fb && _mesa_is_winsys_fbo(fb)) {
  254.       /* Drawing into a window (on-screen buffer).
  255.        *
  256.        * Negate Y scale to flip image vertically.
  257.        * The NDC Y coords prior to viewport transformation are in the range
  258.        * [y=-1=bottom, y=1=top]
  259.        * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where
  260.        * H is the window height.
  261.        * Use the viewport transformation to invert Y.
  262.        */
  263.       return Y_0_TOP;
  264.    }
  265.    else {
  266.       /* Drawing into user-created FBO (very likely a texture).
  267.        *
  268.        * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering.
  269.        */
  270.       return Y_0_BOTTOM;
  271.    }
  272. }
  273.  
  274.  
  275. /** clear-alloc a struct-sized object, with casting */
  276. #define ST_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
  277.  
  278.  
  279. extern struct st_context *
  280. st_create_context(gl_api api, struct pipe_context *pipe,
  281.                   const struct gl_config *visual,
  282.                   struct st_context *share,
  283.                   const struct st_config_options *options);
  284.  
  285. extern void
  286. st_destroy_context(struct st_context *st);
  287.  
  288.  
  289. #ifdef __cplusplus
  290. }
  291. #endif
  292.  
  293. #endif
  294.