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 INTELCONTEXT_INC
  29. #define INTELCONTEXT_INC
  30.  
  31.  
  32. #include <stdbool.h>
  33. #include <string.h>
  34. #include "main/mtypes.h"
  35. #include "main/mm.h"
  36.  
  37. #ifdef __cplusplus
  38. extern "C" {
  39.         /* Evil hack for using libdrm in a c++ compiler. */
  40.         #define virtual virt
  41. #endif
  42.  
  43. #include "drm.h"
  44. #include "intel_bufmgr.h"
  45.  
  46. #include "intel_screen.h"
  47. #include "intel_tex_obj.h"
  48. #include "i915_drm.h"
  49.  
  50. #ifdef __cplusplus
  51.         #undef virtual
  52. #endif
  53.  
  54. #include "tnl/t_vertex.h"
  55.  
  56. #define TAG(x) intel##x
  57. #include "tnl_dd/t_dd_vertex.h"
  58. #undef TAG
  59.  
  60. #define DV_PF_555  (1<<8)
  61. #define DV_PF_565  (2<<8)
  62. #define DV_PF_8888 (3<<8)
  63. #define DV_PF_4444 (8<<8)
  64. #define DV_PF_1555 (9<<8)
  65.  
  66. struct intel_region;
  67. struct intel_context;
  68.  
  69. typedef void (*intel_tri_func) (struct intel_context *, intelVertex *,
  70.                                 intelVertex *, intelVertex *);
  71. typedef void (*intel_line_func) (struct intel_context *, intelVertex *,
  72.                                  intelVertex *);
  73. typedef void (*intel_point_func) (struct intel_context *, intelVertex *);
  74.  
  75. /**
  76.  * Bits for intel->Fallback field
  77.  */
  78. /*@{*/
  79. #define INTEL_FALLBACK_DRAW_BUFFER       0x1
  80. #define INTEL_FALLBACK_READ_BUFFER       0x2
  81. #define INTEL_FALLBACK_DEPTH_BUFFER      0x4
  82. #define INTEL_FALLBACK_STENCIL_BUFFER    0x8
  83. #define INTEL_FALLBACK_USER              0x10
  84. #define INTEL_FALLBACK_RENDERMODE        0x20
  85. #define INTEL_FALLBACK_TEXTURE           0x40
  86. #define INTEL_FALLBACK_DRIVER            0x1000  /**< first for drivers */
  87. /*@}*/
  88.  
  89. extern void intelFallback(struct intel_context *intel, GLbitfield bit,
  90.                           bool mode);
  91. #define FALLBACK( intel, bit, mode ) intelFallback( intel, bit, mode )
  92.  
  93.  
  94. #define INTEL_WRITE_PART  0x1
  95. #define INTEL_WRITE_FULL  0x2
  96. #define INTEL_READ        0x4
  97.  
  98. #ifndef likely
  99. #ifdef __GNUC__
  100. #define likely(expr) (__builtin_expect(expr, 1))
  101. #define unlikely(expr) (__builtin_expect(expr, 0))
  102. #else
  103. #define likely(expr) (expr)
  104. #define unlikely(expr) (expr)
  105. #endif
  106. #endif
  107.  
  108. struct intel_sync_object {
  109.    struct gl_sync_object Base;
  110.  
  111.    /** Batch associated with this sync object */
  112.    drm_intel_bo *bo;
  113. };
  114.  
  115. struct intel_batchbuffer {
  116.    /** Current batchbuffer being queued up. */
  117.    drm_intel_bo *bo;
  118.    /** Last BO submitted to the hardware.  Used for glFinish(). */
  119.    drm_intel_bo *last_bo;
  120.  
  121.    uint16_t emit, total;
  122.    uint16_t used, reserved_space;
  123.    uint32_t *map;
  124.    uint32_t *cpu_map;
  125. #define BATCH_SZ (8192*sizeof(uint32_t))
  126. };
  127.  
  128. /**
  129.  * intel_context is derived from Mesa's context class: struct gl_context.
  130.  */
  131. struct intel_context
  132. {
  133.    struct gl_context ctx;  /**< base class, must be first field */
  134.  
  135.    struct
  136.    {
  137.       void (*destroy) (struct intel_context * intel);
  138.       void (*emit_state) (struct intel_context * intel);
  139.       void (*finish_batch) (struct intel_context * intel);
  140.       void (*new_batch) (struct intel_context * intel);
  141.       void (*emit_invarient_state) (struct intel_context * intel);
  142.       void (*update_texture_state) (struct intel_context * intel);
  143.  
  144.       void (*render_start) (struct intel_context * intel);
  145.       void (*render_prevalidate) (struct intel_context * intel);
  146.       void (*set_draw_region) (struct intel_context * intel,
  147.                                struct intel_region * draw_regions[],
  148.                                struct intel_region * depth_region,
  149.                                GLuint num_regions);
  150.       void (*update_draw_buffer)(struct intel_context *intel);
  151.  
  152.       void (*reduced_primitive_state) (struct intel_context * intel,
  153.                                        GLenum rprim);
  154.  
  155.       bool (*check_vertex_size) (struct intel_context * intel,
  156.                                       GLuint expected);
  157.       void (*invalidate_state) (struct intel_context *intel,
  158.                                 GLuint new_state);
  159.  
  160.       void (*assert_not_dirty) (struct intel_context *intel);
  161.  
  162.       void (*debug_batch)(struct intel_context *intel);
  163.       void (*annotate_aub)(struct intel_context *intel);
  164.       bool (*render_target_supported)(struct intel_context *intel,
  165.                                       struct gl_renderbuffer *rb);
  166.    } vtbl;
  167.  
  168.    GLbitfield Fallback;  /**< mask of INTEL_FALLBACK_x bits */
  169.    GLuint NewGLState;
  170.  
  171.    dri_bufmgr *bufmgr;
  172.    unsigned int maxBatchSize;
  173.  
  174.    /**
  175.     * Generation number of the hardware: 2 is 8xx, 3 is 9xx pre-965, 4 is 965.
  176.     */
  177.    int gen;
  178.    bool is_945;
  179.    bool has_swizzling;
  180.  
  181.    struct intel_batchbuffer batch;
  182.  
  183.    drm_intel_bo *first_post_swapbuffers_batch;
  184.    bool need_throttle;
  185.    bool no_batch_wrap;
  186.    bool tnl_pipeline_running; /**< Set while i915's _tnl_run_pipeline. */
  187.  
  188.    /**
  189.     * Set if we're either a debug context or the INTEL_DEBUG=perf environment
  190.     * variable is set, this is the flag indicating to do expensive work that
  191.     * might lead to a perf_debug() call.
  192.     */
  193.    bool perf_debug;
  194.  
  195.    struct
  196.    {
  197.       GLuint id;
  198.       uint32_t start_ptr; /**< for i8xx */
  199.       uint32_t primitive;       /**< Current hardware primitive type */
  200.       void (*flush) (struct intel_context *);
  201.       drm_intel_bo *vb_bo;
  202.       uint8_t *vb;
  203.       unsigned int start_offset; /**< Byte offset of primitive sequence */
  204.       unsigned int current_offset; /**< Byte offset of next vertex */
  205.       unsigned int count;       /**< Number of vertices in current primitive */
  206.    } prim;
  207.  
  208.    struct {
  209.       drm_intel_bo *bo;
  210.       GLuint offset;
  211.       uint32_t buffer_len;
  212.       uint32_t buffer_offset;
  213.       char buffer[4096];
  214.    } upload;
  215.  
  216.    uint32_t max_gtt_map_object_size;
  217.  
  218.    /* Offsets of fields within the current vertex:
  219.     */
  220.    GLuint coloroffset;
  221.    GLuint specoffset;
  222.    GLuint wpos_offset;
  223.  
  224.    struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
  225.    GLuint vertex_attr_count;
  226.  
  227.    GLfloat polygon_offset_scale;        /* dependent on depth_scale, bpp */
  228.  
  229.    bool hw_stencil;
  230.    bool hw_stipple;
  231.    bool no_rast;
  232.    bool always_flush_batch;
  233.    bool always_flush_cache;
  234.    bool disable_throttling;
  235.  
  236.    /* State for intelvb.c and inteltris.c.
  237.     */
  238.    GLuint RenderIndex;
  239.    GLmatrix ViewportMatrix;
  240.    GLenum render_primitive;
  241.    GLenum reduced_primitive; /*< Only gen < 6 */
  242.    GLuint vertex_size;
  243.    GLubyte *verts;              /* points to tnl->clipspace.vertex_buf */
  244.  
  245.    /* Fallback rasterization functions
  246.     */
  247.    intel_point_func draw_point;
  248.    intel_line_func draw_line;
  249.    intel_tri_func draw_tri;
  250.  
  251.    /**
  252.     * Set if rendering has occured to the drawable's front buffer.
  253.     *
  254.     * This is used in the DRI2 case to detect that glFlush should also copy
  255.     * the contents of the fake front buffer to the real front buffer.
  256.     */
  257.    bool front_buffer_dirty;
  258.  
  259.    /**
  260.     * Track whether front-buffer rendering is currently enabled
  261.     *
  262.     * A separate flag is used to track this in order to support MRT more
  263.     * easily.
  264.     */
  265.    bool is_front_buffer_rendering;
  266.    /**
  267.     * Track whether front-buffer is the current read target.
  268.     *
  269.     * This is closely associated with is_front_buffer_rendering, but may
  270.     * be set separately.  The DRI2 fake front buffer must be referenced
  271.     * either way.
  272.     */
  273.    bool is_front_buffer_reading;
  274.  
  275.    bool use_early_z;
  276.  
  277.    int driFd;
  278.  
  279.    __DRIcontext *driContext;
  280.    struct intel_screen *intelScreen;
  281.    void (*saved_viewport)(struct gl_context * ctx,
  282.                           GLint x, GLint y, GLsizei width, GLsizei height);
  283.  
  284.    /**
  285.     * Configuration cache
  286.     */
  287.    driOptionCache optionCache;
  288. };
  289.  
  290. extern char *__progname;
  291.  
  292.  
  293. #define SUBPIXEL_X 0.125
  294. #define SUBPIXEL_Y 0.125
  295.  
  296. /**
  297.  * Align a value down to an alignment value
  298.  *
  299.  * If \c value is not already aligned to the requested alignment value, it
  300.  * will be rounded down.
  301.  *
  302.  * \param value  Value to be rounded
  303.  * \param alignment  Alignment value to be used.  This must be a power of two.
  304.  *
  305.  * \sa ALIGN()
  306.  */
  307. #define ROUND_DOWN_TO(value, alignment) ((value) & ~(alignment - 1))
  308.  
  309. static INLINE uint32_t
  310. U_FIXED(float value, uint32_t frac_bits)
  311. {
  312.    value *= (1 << frac_bits);
  313.    return value < 0 ? 0 : value;
  314. }
  315.  
  316. static INLINE uint32_t
  317. S_FIXED(float value, uint32_t frac_bits)
  318. {
  319.    return value * (1 << frac_bits);
  320. }
  321.  
  322. #define INTEL_FIREVERTICES(intel)               \
  323. do {                                            \
  324.    if ((intel)->prim.flush)                     \
  325.       (intel)->prim.flush(intel);               \
  326. } while (0)
  327.  
  328. /* ================================================================
  329.  * From linux kernel i386 header files, copes with odd sizes better
  330.  * than COPY_DWORDS would:
  331.  * XXX Put this in src/mesa/main/imports.h ???
  332.  */
  333. #if defined(i386) || defined(__i386__)
  334. static INLINE void * __memcpy(void * to, const void * from, size_t n)
  335. {
  336.    int d0, d1, d2;
  337.    __asm__ __volatile__(
  338.       "rep ; movsl\n\t"
  339.       "testb $2,%b4\n\t"
  340.       "je 1f\n\t"
  341.       "movsw\n"
  342.       "1:\ttestb $1,%b4\n\t"
  343.       "je 2f\n\t"
  344.       "movsb\n"
  345.       "2:"
  346.       : "=&c" (d0), "=&D" (d1), "=&S" (d2)
  347.       :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
  348.       : "memory");
  349.    return (to);
  350. }
  351. #else
  352. #define __memcpy(a,b,c) memcpy(a,b,c)
  353. #endif
  354.  
  355.  
  356. /* ================================================================
  357.  * Debugging:
  358.  */
  359. extern int INTEL_DEBUG;
  360.  
  361. #define DEBUG_TEXTURE   0x1
  362. #define DEBUG_STATE     0x2
  363. #define DEBUG_BLIT      0x8
  364. #define DEBUG_MIPTREE   0x10
  365. #define DEBUG_PERF      0x20
  366. #define DEBUG_BATCH     0x80
  367. #define DEBUG_PIXEL     0x100
  368. #define DEBUG_BUFMGR    0x200
  369. #define DEBUG_REGION    0x400
  370. #define DEBUG_FBO       0x800
  371. #define DEBUG_SYNC      0x2000
  372. #define DEBUG_DRI       0x10000
  373. #define DEBUG_STATS     0x100000
  374. #define DEBUG_WM        0x400000
  375. #define DEBUG_AUB       0x4000000
  376.  
  377. #ifdef HAVE_ANDROID_PLATFORM
  378. #define LOG_TAG "INTEL-MESA"
  379. #include <cutils/log.h>
  380. #ifndef ALOGW
  381. #define ALOGW LOGW
  382. #endif
  383. #define dbg_printf(...) ALOGW(__VA_ARGS__)
  384. #else
  385. #define dbg_printf(...) printf(__VA_ARGS__)
  386. #endif /* HAVE_ANDROID_PLATFORM */
  387.  
  388. #define DBG(...) do {                                           \
  389.         if (unlikely(INTEL_DEBUG & FILE_DEBUG_FLAG))            \
  390.                 dbg_printf(__VA_ARGS__);                        \
  391. } while(0)
  392.  
  393. #define perf_debug(...) do {                                    \
  394.    static GLuint msg_id = 0;                                    \
  395.    if (unlikely(INTEL_DEBUG & DEBUG_PERF))                      \
  396.       dbg_printf(__VA_ARGS__);                                  \
  397.    if (intel->perf_debug)                                       \
  398.       _mesa_gl_debug(&intel->ctx, &msg_id,                      \
  399.                      MESA_DEBUG_TYPE_PERFORMANCE,               \
  400.                      MESA_DEBUG_SEVERITY_MEDIUM,                \
  401.                      __VA_ARGS__);                              \
  402. } while(0)
  403.  
  404. #define WARN_ONCE(cond, fmt...) do {                            \
  405.    if (unlikely(cond)) {                                        \
  406.       static bool _warned = false;                              \
  407.       static GLuint msg_id = 0;                                 \
  408.       if (!_warned) {                                           \
  409.          fprintf(stderr, "WARNING: ");                          \
  410.          fprintf(stderr, fmt);                                  \
  411.          _warned = true;                                        \
  412.                                                                 \
  413.          _mesa_gl_debug(ctx, &msg_id,                           \
  414.                         MESA_DEBUG_TYPE_OTHER,                  \
  415.                         MESA_DEBUG_SEVERITY_HIGH, fmt);         \
  416.       }                                                         \
  417.    }                                                            \
  418. } while (0)
  419.  
  420. /* ================================================================
  421.  * intel_context.c:
  422.  */
  423.  
  424. extern bool intelInitContext(struct intel_context *intel,
  425.                              int api,
  426.                              unsigned major_version,
  427.                              unsigned minor_version,
  428.                              const struct gl_config * mesaVis,
  429.                              __DRIcontext * driContextPriv,
  430.                              void *sharedContextPrivate,
  431.                              struct dd_function_table *functions,
  432.                              unsigned *dri_ctx_error);
  433.  
  434. extern void intelFinish(struct gl_context * ctx);
  435. extern void intel_flush_rendering_to_batch(struct gl_context *ctx);
  436. extern void _intel_flush(struct gl_context * ctx, const char *file, int line);
  437.  
  438. #define intel_flush(ctx) _intel_flush(ctx, __FILE__, __LINE__)
  439.  
  440. extern void intelInitDriverFunctions(struct dd_function_table *functions);
  441.  
  442. void intel_init_syncobj_functions(struct dd_function_table *functions);
  443.  
  444.  
  445. /* ================================================================
  446.  * intel_state.c:
  447.  */
  448.  
  449. #define COMPAREFUNC_ALWAYS              0
  450. #define COMPAREFUNC_NEVER               0x1
  451. #define COMPAREFUNC_LESS                0x2
  452. #define COMPAREFUNC_EQUAL               0x3
  453. #define COMPAREFUNC_LEQUAL              0x4
  454. #define COMPAREFUNC_GREATER             0x5
  455. #define COMPAREFUNC_NOTEQUAL            0x6
  456. #define COMPAREFUNC_GEQUAL              0x7
  457.  
  458. #define STENCILOP_KEEP                  0
  459. #define STENCILOP_ZERO                  0x1
  460. #define STENCILOP_REPLACE               0x2
  461. #define STENCILOP_INCRSAT               0x3
  462. #define STENCILOP_DECRSAT               0x4
  463. #define STENCILOP_INCR                  0x5
  464. #define STENCILOP_DECR                  0x6
  465. #define STENCILOP_INVERT                0x7
  466.  
  467. #define LOGICOP_CLEAR                   0
  468. #define LOGICOP_NOR                     0x1
  469. #define LOGICOP_AND_INV                 0x2
  470. #define LOGICOP_COPY_INV                0x3
  471. #define LOGICOP_AND_RVRSE               0x4
  472. #define LOGICOP_INV                     0x5
  473. #define LOGICOP_XOR                     0x6
  474. #define LOGICOP_NAND                    0x7
  475. #define LOGICOP_AND                     0x8
  476. #define LOGICOP_EQUIV                   0x9
  477. #define LOGICOP_NOOP                    0xa
  478. #define LOGICOP_OR_INV                  0xb
  479. #define LOGICOP_COPY                    0xc
  480. #define LOGICOP_OR_RVRSE                0xd
  481. #define LOGICOP_OR                      0xe
  482. #define LOGICOP_SET                     0xf
  483.  
  484. #define BLENDFACT_ZERO                  0x01
  485. #define BLENDFACT_ONE                   0x02
  486. #define BLENDFACT_SRC_COLR              0x03
  487. #define BLENDFACT_INV_SRC_COLR          0x04
  488. #define BLENDFACT_SRC_ALPHA             0x05
  489. #define BLENDFACT_INV_SRC_ALPHA         0x06
  490. #define BLENDFACT_DST_ALPHA             0x07
  491. #define BLENDFACT_INV_DST_ALPHA         0x08
  492. #define BLENDFACT_DST_COLR              0x09
  493. #define BLENDFACT_INV_DST_COLR          0x0a
  494. #define BLENDFACT_SRC_ALPHA_SATURATE    0x0b
  495. #define BLENDFACT_CONST_COLOR           0x0c
  496. #define BLENDFACT_INV_CONST_COLOR       0x0d
  497. #define BLENDFACT_CONST_ALPHA           0x0e
  498. #define BLENDFACT_INV_CONST_ALPHA       0x0f
  499. #define BLENDFACT_MASK                  0x0f
  500.  
  501. enum {
  502.    DRI_CONF_BO_REUSE_DISABLED,
  503.    DRI_CONF_BO_REUSE_ALL
  504. };
  505.  
  506. extern int intel_translate_shadow_compare_func(GLenum func);
  507. extern int intel_translate_compare_func(GLenum func);
  508. extern int intel_translate_stencil_op(GLenum op);
  509. extern int intel_translate_blend_factor(GLenum factor);
  510. extern int intel_translate_logic_op(GLenum opcode);
  511.  
  512. void intel_update_renderbuffers(__DRIcontext *context,
  513.                                 __DRIdrawable *drawable);
  514. void intel_prepare_render(struct intel_context *intel);
  515.  
  516. void i915_set_buf_info_for_region(uint32_t *state, struct intel_region *region,
  517.                                   uint32_t buffer_id);
  518. void intel_init_texture_formats(struct gl_context *ctx);
  519.  
  520. /*======================================================================
  521.  * Inline conversion functions.  
  522.  * These are better-typed than the macros used previously:
  523.  */
  524. static INLINE struct intel_context *
  525. intel_context(struct gl_context * ctx)
  526. {
  527.    return (struct intel_context *) ctx;
  528. }
  529.  
  530. static INLINE bool
  531. is_power_of_two(uint32_t value)
  532. {
  533.    return (value & (value - 1)) == 0;
  534. }
  535.  
  536. #ifdef __cplusplus
  537. }
  538. #endif
  539.  
  540. #endif
  541.