Subversion Repositories Kolibri OS

Rev

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

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2009 Marek Olšák <maraeo@gmail.com>
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the
  7.  * "Software"), to deal in the Software without restriction, including
  8.  * without limitation the rights to use, copy, modify, merge, publish,
  9.  * distribute, sub license, and/or sell copies of the Software, and to
  10.  * permit persons to whom the Software is furnished to do so, subject to
  11.  * the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice (including the
  14.  * next paragraph) shall be included in all copies or substantial portions
  15.  * of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  20.  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
  21.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  22.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  23.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24.  *
  25.  **************************************************************************/
  26.  
  27. #ifndef U_BLITTER_H
  28. #define U_BLITTER_H
  29.  
  30. #include "util/u_framebuffer.h"
  31. #include "util/u_inlines.h"
  32.  
  33. #include "pipe/p_state.h"
  34.  
  35. /* u_memory.h conflicts with st/mesa */
  36. #ifndef Elements
  37. #define Elements(x) (sizeof(x)/sizeof((x)[0]))
  38. #endif
  39.  
  40.  
  41. #ifdef __cplusplus
  42. extern "C" {
  43. #endif
  44.  
  45. struct pipe_context;
  46.  
  47. enum blitter_attrib_type {
  48.    UTIL_BLITTER_ATTRIB_NONE,
  49.    UTIL_BLITTER_ATTRIB_COLOR,
  50.    UTIL_BLITTER_ATTRIB_TEXCOORD
  51. };
  52.  
  53. struct blitter_context
  54. {
  55.    /**
  56.     * Draw a rectangle.
  57.     *
  58.     * \param x1      An X coordinate of the top-left corner.
  59.     * \param y1      A Y coordinate of the top-left corner.
  60.     * \param x2      An X coordinate of the bottom-right corner.
  61.     * \param y2      A Y coordinate of the bottom-right corner.
  62.     * \param depth   A depth which the rectangle is rendered at.
  63.     *
  64.     * \param type   Semantics of the attributes "attrib".
  65.     *               If type is UTIL_BLITTER_ATTRIB_NONE, ignore them.
  66.     *               If type is UTIL_BLITTER_ATTRIB_COLOR, the attributes
  67.     *               make up a constant RGBA color, and should go
  68.     *               to the GENERIC0 varying slot of a fragment shader.
  69.     *               If type is UTIL_BLITTER_ATTRIB_TEXCOORD, {a1, a2} and
  70.     *               {a3, a4} specify top-left and bottom-right texture
  71.     *               coordinates of the rectangle, respectively, and should go
  72.     *               to the GENERIC0 varying slot of a fragment shader.
  73.     *
  74.     * \param attrib See type.
  75.     *
  76.     * \note A driver may optionally override this callback to implement
  77.     *       a specialized hardware path for drawing a rectangle, e.g. using
  78.     *       a rectangular point sprite.
  79.     */
  80.    void (*draw_rectangle)(struct blitter_context *blitter,
  81.                           int x1, int y1, int x2, int y2,
  82.                           float depth,
  83.                           enum blitter_attrib_type type,
  84.                           const union pipe_color_union *color);
  85.  
  86.    /**
  87.     * Get the next surface layer for the pipe surface, i.e. make a copy
  88.     * of the surface and increment the first and last layer by 1.
  89.     *
  90.     * This callback is exposed, so that drivers can override it if needed.
  91.     */
  92.    struct pipe_surface *(*get_next_surface_layer)(struct pipe_context *pipe,
  93.                                                   struct pipe_surface *surf);
  94.  
  95.    /* Whether the blitter is running. */
  96.    boolean running;
  97.  
  98.    /* Private members, really. */
  99.    struct pipe_context *pipe; /**< pipe context */
  100.  
  101.    void *saved_blend_state;   /**< blend state */
  102.    void *saved_dsa_state;     /**< depth stencil alpha state */
  103.    void *saved_velem_state;   /**< vertex elements state */
  104.    void *saved_rs_state;      /**< rasterizer state */
  105.    void *saved_fs, *saved_vs, *saved_gs; /**< shaders */
  106.  
  107.    struct pipe_framebuffer_state saved_fb_state;  /**< framebuffer state */
  108.    struct pipe_stencil_ref saved_stencil_ref;     /**< stencil ref */
  109.    struct pipe_viewport_state saved_viewport;
  110.    struct pipe_scissor_state saved_scissor;
  111.    boolean is_sample_mask_saved;
  112.    unsigned saved_sample_mask;
  113.  
  114.    unsigned saved_num_sampler_states;
  115.    void *saved_sampler_states[PIPE_MAX_SAMPLERS];
  116.  
  117.    unsigned saved_num_sampler_views;
  118.    struct pipe_sampler_view *saved_sampler_views[PIPE_MAX_SAMPLERS];
  119.  
  120.    unsigned vb_slot;
  121.    struct pipe_vertex_buffer saved_vertex_buffer;
  122.  
  123.    unsigned saved_num_so_targets;
  124.    struct pipe_stream_output_target *saved_so_targets[PIPE_MAX_SO_BUFFERS];
  125.  
  126.    struct pipe_query *saved_render_cond_query;
  127.    uint saved_render_cond_mode;
  128.    boolean saved_render_cond_cond;
  129. };
  130.  
  131. /**
  132.  * Create a blitter context.
  133.  */
  134. struct blitter_context *util_blitter_create(struct pipe_context *pipe);
  135.  
  136. /**
  137.  * Destroy a blitter context.
  138.  */
  139. void util_blitter_destroy(struct blitter_context *blitter);
  140.  
  141. void util_blitter_cache_all_shaders(struct blitter_context *blitter);
  142.  
  143. /**
  144.  * Return the pipe context associated with a blitter context.
  145.  */
  146. static INLINE
  147. struct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter)
  148. {
  149.    return blitter->pipe;
  150. }
  151.  
  152. /**
  153.  * Override PIPE_CAP_TEXTURE_MULTISAMPLE as reported by the driver.
  154.  */
  155. void util_blitter_set_texture_multisample(struct blitter_context *blitter,
  156.                                           boolean supported);
  157.  
  158. /* The default function to draw a rectangle. This can only be used
  159.  * inside of the draw_rectangle callback if the driver overrides it. */
  160. void util_blitter_draw_rectangle(struct blitter_context *blitter,
  161.                                  int x1, int y1, int x2, int y2, float depth,
  162.                                  enum blitter_attrib_type type,
  163.                                  const union pipe_color_union *attrib);
  164.  
  165.  
  166. /*
  167.  * These states must be saved before any of the following functions are called:
  168.  * - vertex buffers
  169.  * - vertex elements
  170.  * - vertex shader
  171.  * - geometry shader (if supported)
  172.  * - stream output targets (if supported)
  173.  * - rasterizer state
  174.  */
  175.  
  176. /**
  177.  * Clear a specified set of currently bound buffers to specified values.
  178.  *
  179.  * These states must be saved in the blitter in addition to the state objects
  180.  * already required to be saved:
  181.  * - fragment shader
  182.  * - depth stencil alpha state
  183.  * - blend state
  184.  */
  185. void util_blitter_clear(struct blitter_context *blitter,
  186.                         unsigned width, unsigned height,
  187.                         unsigned clear_buffers,
  188.                         const union pipe_color_union *color,
  189.                         double depth, unsigned stencil);
  190.  
  191. /**
  192.  * Check if the blitter (with the help of the driver) can blit between
  193.  * the two resources.
  194.  * The mask is a combination of the PIPE_MASK_* flags.
  195.  * Set to PIPE_MASK_RGBAZS if unsure.
  196.  */
  197. boolean util_blitter_is_copy_supported(struct blitter_context *blitter,
  198.                                        const struct pipe_resource *dst,
  199.                                        const struct pipe_resource *src,
  200.                                        unsigned mask);
  201.  
  202. boolean util_blitter_is_blit_supported(struct blitter_context *blitter,
  203.                                        const struct pipe_blit_info *info);
  204.  
  205. /**
  206.  * Copy a block of pixels from one surface to another.
  207.  *
  208.  * These states must be saved in the blitter in addition to the state objects
  209.  * already required to be saved:
  210.  * - fragment shader
  211.  * - depth stencil alpha state
  212.  * - blend state
  213.  * - fragment sampler states
  214.  * - fragment sampler textures
  215.  * - framebuffer state
  216.  * - sample mask
  217.  */
  218. void util_blitter_copy_texture(struct blitter_context *blitter,
  219.                                struct pipe_resource *dst,
  220.                                unsigned dst_level,
  221.                                unsigned dstx, unsigned dsty, unsigned dstz,
  222.                                struct pipe_resource *src,
  223.                                unsigned src_level,
  224.                                const struct pipe_box *srcbox, unsigned mask,
  225.                                boolean copy_all_samples);
  226.  
  227. /**
  228.  * This is a generic implementation of pipe->blit, which accepts
  229.  * sampler/surface views instead of resources.
  230.  *
  231.  * The layer and mipmap level are specified by the views.
  232.  *
  233.  * Drivers can use this to change resource properties (like format, width,
  234.  * height) by changing how the views interpret them, instead of changing
  235.  * pipe_resource directly. This is used to blit resources of formats which
  236.  * are not renderable.
  237.  *
  238.  * src_width0 and src_height0 are sampler_view-private properties that
  239.  * override pipe_resource. The blitter uses them for computation of texture
  240.  * coordinates. The dst dimensions are supplied through pipe_surface::width
  241.  * and height.
  242.  *
  243.  * The mask is a combination of the PIPE_MASK_* flags.
  244.  * Set to PIPE_MASK_RGBAZS if unsure.
  245.  */
  246. void util_blitter_blit_generic(struct blitter_context *blitter,
  247.                                struct pipe_surface *dst,
  248.                                const struct pipe_box *dstbox,
  249.                                struct pipe_sampler_view *src,
  250.                                const struct pipe_box *srcbox,
  251.                                unsigned src_width0, unsigned src_height0,
  252.                                unsigned mask, unsigned filter,
  253.                                const struct pipe_scissor_state *scissor,
  254.                                boolean copy_all_samples);
  255.  
  256. void util_blitter_blit(struct blitter_context *blitter,
  257.                        const struct pipe_blit_info *info);
  258.  
  259. /**
  260.  * Helper function to initialize a view for copy_texture_view.
  261.  * The parameters must match copy_texture_view.
  262.  */
  263. void util_blitter_default_dst_texture(struct pipe_surface *dst_templ,
  264.                                       struct pipe_resource *dst,
  265.                                       unsigned dstlevel,
  266.                                       unsigned dstz);
  267.  
  268. /**
  269.  * Helper function to initialize a view for copy_texture_view.
  270.  * The parameters must match copy_texture_view.
  271.  */
  272. void util_blitter_default_src_texture(struct pipe_sampler_view *src_templ,
  273.                                       struct pipe_resource *src,
  274.                                       unsigned srclevel);
  275.  
  276. /**
  277.  * Copy data from one buffer to another using the Stream Output functionality.
  278.  * 4-byte alignment is required, otherwise software fallback is used.
  279.  */
  280. void util_blitter_copy_buffer(struct blitter_context *blitter,
  281.                               struct pipe_resource *dst,
  282.                               unsigned dstx,
  283.                               struct pipe_resource *src,
  284.                               unsigned srcx,
  285.                               unsigned size);
  286.  
  287. /**
  288.  * Clear the contents of a buffer using the Stream Output functionality.
  289.  * 4-byte alignment is required.
  290.  *
  291.  * "num_channels" can be 1, 2, 3, or 4, and specifies if the clear value is
  292.  * R, RG, RGB, or RGBA.
  293.  *
  294.  * For each element, only "num_channels" components of "clear_value" are
  295.  * copied to the buffer, then the offset is incremented by num_channels*4.
  296.  */
  297. void util_blitter_clear_buffer(struct blitter_context *blitter,
  298.                                struct pipe_resource *dst,
  299.                                unsigned offset, unsigned size,
  300.                                unsigned num_channels,
  301.                                const union pipe_color_union *clear_value);
  302.  
  303. /**
  304.  * Clear a region of a (color) surface to a constant value.
  305.  *
  306.  * These states must be saved in the blitter in addition to the state objects
  307.  * already required to be saved:
  308.  * - fragment shader
  309.  * - depth stencil alpha state
  310.  * - blend state
  311.  * - framebuffer state
  312.  */
  313. void util_blitter_clear_render_target(struct blitter_context *blitter,
  314.                                       struct pipe_surface *dst,
  315.                                       const union pipe_color_union *color,
  316.                                       unsigned dstx, unsigned dsty,
  317.                                       unsigned width, unsigned height);
  318.  
  319. /**
  320.  * Clear a region of a depth-stencil surface, both stencil and depth
  321.  * or only one of them if this is a combined depth-stencil surface.
  322.  *
  323.  * These states must be saved in the blitter in addition to the state objects
  324.  * already required to be saved:
  325.  * - fragment shader
  326.  * - depth stencil alpha state
  327.  * - blend state
  328.  * - framebuffer state
  329.  */
  330. void util_blitter_clear_depth_stencil(struct blitter_context *blitter,
  331.                                       struct pipe_surface *dst,
  332.                                       unsigned clear_flags,
  333.                                       double depth,
  334.                                       unsigned stencil,
  335.                                       unsigned dstx, unsigned dsty,
  336.                                       unsigned width, unsigned height);
  337.  
  338. /* The following functions are customized variants of the clear functions.
  339.  * Some drivers use them internally to do things like MSAA resolve
  340.  * and resource decompression. It usually consists of rendering a full-screen
  341.  * quad with a special blend or DSA state.
  342.  */
  343.  
  344. /* Used by r300g for depth decompression. */
  345. void util_blitter_custom_clear_depth(struct blitter_context *blitter,
  346.                                      unsigned width, unsigned height,
  347.                                      double depth, void *custom_dsa);
  348.  
  349. /* Used by r600g for depth decompression. */
  350. void util_blitter_custom_depth_stencil(struct blitter_context *blitter,
  351.                                        struct pipe_surface *zsurf,
  352.                                        struct pipe_surface *cbsurf,
  353.                                        unsigned sample_mask,
  354.                                        void *dsa_stage, float depth);
  355.  
  356. /* Used by r600g for color decompression. */
  357. void util_blitter_custom_color(struct blitter_context *blitter,
  358.                                struct pipe_surface *dstsurf,
  359.                                void *custom_blend);
  360.  
  361. /* Used by r600g for MSAA color resolve. */
  362. void util_blitter_custom_resolve_color(struct blitter_context *blitter,
  363.                                        struct pipe_resource *dst,
  364.                                        unsigned dst_level,
  365.                                        unsigned dst_layer,
  366.                                        struct pipe_resource *src,
  367.                                        unsigned src_layer,
  368.                                        unsigned sampled_mask,
  369.                                        void *custom_blend,
  370.                                        enum pipe_format format);
  371.  
  372. /* The functions below should be used to save currently bound constant state
  373.  * objects inside a driver. The objects are automatically restored at the end
  374.  * of the util_blitter_{clear, copy_region, fill_region} functions and then
  375.  * forgotten.
  376.  *
  377.  * States not listed here are not affected by util_blitter. */
  378.  
  379. static INLINE
  380. void util_blitter_save_blend(struct blitter_context *blitter,
  381.                              void *state)
  382. {
  383.    blitter->saved_blend_state = state;
  384. }
  385.  
  386. static INLINE
  387. void util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter,
  388.                                            void *state)
  389. {
  390.    blitter->saved_dsa_state = state;
  391. }
  392.  
  393. static INLINE
  394. void util_blitter_save_vertex_elements(struct blitter_context *blitter,
  395.                                        void *state)
  396. {
  397.    blitter->saved_velem_state = state;
  398. }
  399.  
  400. static INLINE
  401. void util_blitter_save_stencil_ref(struct blitter_context *blitter,
  402.                                    const struct pipe_stencil_ref *state)
  403. {
  404.    blitter->saved_stencil_ref = *state;
  405. }
  406.  
  407. static INLINE
  408. void util_blitter_save_rasterizer(struct blitter_context *blitter,
  409.                                   void *state)
  410. {
  411.    blitter->saved_rs_state = state;
  412. }
  413.  
  414. static INLINE
  415. void util_blitter_save_fragment_shader(struct blitter_context *blitter,
  416.                                        void *fs)
  417. {
  418.    blitter->saved_fs = fs;
  419. }
  420.  
  421. static INLINE
  422. void util_blitter_save_vertex_shader(struct blitter_context *blitter,
  423.                                      void *vs)
  424. {
  425.    blitter->saved_vs = vs;
  426. }
  427.  
  428. static INLINE
  429. void util_blitter_save_geometry_shader(struct blitter_context *blitter,
  430.                                        void *gs)
  431. {
  432.    blitter->saved_gs = gs;
  433. }
  434.  
  435. static INLINE
  436. void util_blitter_save_framebuffer(struct blitter_context *blitter,
  437.                                    const struct pipe_framebuffer_state *state)
  438. {
  439.    blitter->saved_fb_state.nr_cbufs = 0; /* It's ~0 now, meaning it's unsaved. */
  440.    util_copy_framebuffer_state(&blitter->saved_fb_state, state);
  441. }
  442.  
  443. static INLINE
  444. void util_blitter_save_viewport(struct blitter_context *blitter,
  445.                                 struct pipe_viewport_state *state)
  446. {
  447.    blitter->saved_viewport = *state;
  448. }
  449.  
  450. static INLINE
  451. void util_blitter_save_scissor(struct blitter_context *blitter,
  452.                                struct pipe_scissor_state *state)
  453. {
  454.    blitter->saved_scissor = *state;
  455. }
  456.  
  457. static INLINE
  458. void util_blitter_save_fragment_sampler_states(
  459.                   struct blitter_context *blitter,
  460.                   unsigned num_sampler_states,
  461.                   void **sampler_states)
  462. {
  463.    assert(num_sampler_states <= Elements(blitter->saved_sampler_states));
  464.  
  465.    blitter->saved_num_sampler_states = num_sampler_states;
  466.    memcpy(blitter->saved_sampler_states, sampler_states,
  467.           num_sampler_states * sizeof(void *));
  468. }
  469.  
  470. static INLINE void
  471. util_blitter_save_fragment_sampler_views(struct blitter_context *blitter,
  472.                                          unsigned num_views,
  473.                                          struct pipe_sampler_view **views)
  474. {
  475.    unsigned i;
  476.    assert(num_views <= Elements(blitter->saved_sampler_views));
  477.  
  478.    blitter->saved_num_sampler_views = num_views;
  479.    for (i = 0; i < num_views; i++)
  480.       pipe_sampler_view_reference(&blitter->saved_sampler_views[i],
  481.                                   views[i]);
  482. }
  483.  
  484. static INLINE void
  485. util_blitter_save_vertex_buffer_slot(struct blitter_context *blitter,
  486.                                      struct pipe_vertex_buffer *vertex_buffers)
  487. {
  488.    pipe_resource_reference(&blitter->saved_vertex_buffer.buffer,
  489.                            vertex_buffers[blitter->vb_slot].buffer);
  490.    memcpy(&blitter->saved_vertex_buffer, &vertex_buffers[blitter->vb_slot],
  491.           sizeof(struct pipe_vertex_buffer));
  492. }
  493.  
  494. static INLINE void
  495. util_blitter_save_so_targets(struct blitter_context *blitter,
  496.                              unsigned num_targets,
  497.                              struct pipe_stream_output_target **targets)
  498. {
  499.    unsigned i;
  500.    assert(num_targets <= Elements(blitter->saved_so_targets));
  501.  
  502.    blitter->saved_num_so_targets = num_targets;
  503.    for (i = 0; i < num_targets; i++)
  504.       pipe_so_target_reference(&blitter->saved_so_targets[i],
  505.                                targets[i]);
  506. }
  507.  
  508. static INLINE void
  509. util_blitter_save_sample_mask(struct blitter_context *blitter,
  510.                               unsigned sample_mask)
  511. {
  512.    blitter->is_sample_mask_saved = TRUE;
  513.    blitter->saved_sample_mask = sample_mask;
  514. }
  515.  
  516. static INLINE void
  517. util_blitter_save_render_condition(struct blitter_context *blitter,
  518.                                    struct pipe_query *query,
  519.                                    boolean condition,
  520.                                    uint mode)
  521. {
  522.    blitter->saved_render_cond_query = query;
  523.    blitter->saved_render_cond_mode = mode;
  524.    blitter->saved_render_cond_cond = condition;
  525. }
  526.  
  527. #ifdef __cplusplus
  528. }
  529. #endif
  530.  
  531. #endif
  532.