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. struct intel_region;
  57.  
  58. #define INTEL_WRITE_PART  0x1
  59. #define INTEL_WRITE_FULL  0x2
  60. #define INTEL_READ        0x4
  61.  
  62. #ifndef likely
  63. #ifdef __GNUC__
  64. #define likely(expr) (__builtin_expect(expr, 1))
  65. #define unlikely(expr) (__builtin_expect(expr, 0))
  66. #else
  67. #define likely(expr) (expr)
  68. #define unlikely(expr) (expr)
  69. #endif
  70. #endif
  71.  
  72. struct intel_sync_object {
  73.    struct gl_sync_object Base;
  74.  
  75.    /** Batch associated with this sync object */
  76.    drm_intel_bo *bo;
  77. };
  78.  
  79. struct brw_context;
  80.  
  81. struct intel_batchbuffer {
  82.    /** Current batchbuffer being queued up. */
  83.    drm_intel_bo *bo;
  84.    /** Last BO submitted to the hardware.  Used for glFinish(). */
  85.    drm_intel_bo *last_bo;
  86.    /** BO for post-sync nonzero writes for gen6 workaround. */
  87.    drm_intel_bo *workaround_bo;
  88.    bool need_workaround_flush;
  89.  
  90.    struct cached_batch_item *cached_items;
  91.  
  92.    uint16_t emit, total;
  93.    uint16_t used, reserved_space;
  94.    uint32_t *map;
  95.    uint32_t *cpu_map;
  96. #define BATCH_SZ (8192*sizeof(uint32_t))
  97.  
  98.    uint32_t state_batch_offset;
  99.    bool is_blit;
  100.    bool needs_sol_reset;
  101.  
  102.    struct {
  103.       uint16_t used;
  104.       int reloc_count;
  105.    } saved;
  106. };
  107.  
  108. /**
  109.  * Align a value down to an alignment value
  110.  *
  111.  * If \c value is not already aligned to the requested alignment value, it
  112.  * will be rounded down.
  113.  *
  114.  * \param value  Value to be rounded
  115.  * \param alignment  Alignment value to be used.  This must be a power of two.
  116.  *
  117.  * \sa ALIGN()
  118.  */
  119. #define ROUND_DOWN_TO(value, alignment) ((value) & ~(alignment - 1))
  120.  
  121. static INLINE uint32_t
  122. U_FIXED(float value, uint32_t frac_bits)
  123. {
  124.    value *= (1 << frac_bits);
  125.    return value < 0 ? 0 : value;
  126. }
  127.  
  128. static INLINE uint32_t
  129. S_FIXED(float value, uint32_t frac_bits)
  130. {
  131.    return value * (1 << frac_bits);
  132. }
  133.  
  134. /* ================================================================
  135.  * From linux kernel i386 header files, copes with odd sizes better
  136.  * than COPY_DWORDS would:
  137.  * XXX Put this in src/mesa/main/imports.h ???
  138.  */
  139. #if defined(i386) || defined(__i386__)
  140. static INLINE void * __memcpy(void * to, const void * from, size_t n)
  141. {
  142.    int d0, d1, d2;
  143.    __asm__ __volatile__(
  144.       "rep ; movsl\n\t"
  145.       "testb $2,%b4\n\t"
  146.       "je 1f\n\t"
  147.       "movsw\n"
  148.       "1:\ttestb $1,%b4\n\t"
  149.       "je 2f\n\t"
  150.       "movsb\n"
  151.       "2:"
  152.       : "=&c" (d0), "=&D" (d1), "=&S" (d2)
  153.       :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
  154.       : "memory");
  155.    return (to);
  156. }
  157. #else
  158. #define __memcpy(a,b,c) memcpy(a,b,c)
  159. #endif
  160.  
  161.  
  162. /* ================================================================
  163.  * Debugging:
  164.  */
  165. extern int INTEL_DEBUG;
  166.  
  167. #define DEBUG_TEXTURE   0x1
  168. #define DEBUG_STATE     0x2
  169. #define DEBUG_IOCTL     0x4
  170. #define DEBUG_BLIT      0x8
  171. #define DEBUG_MIPTREE   0x10
  172. #define DEBUG_PERF      0x20
  173. #define DEBUG_BATCH     0x80
  174. #define DEBUG_PIXEL     0x100
  175. #define DEBUG_BUFMGR    0x200
  176. #define DEBUG_REGION    0x400
  177. #define DEBUG_FBO       0x800
  178. #define DEBUG_GS        0x1000
  179. #define DEBUG_SYNC      0x2000
  180. #define DEBUG_PRIMS     0x4000
  181. #define DEBUG_VERTS     0x8000
  182. #define DEBUG_DRI       0x10000
  183. #define DEBUG_SF        0x20000
  184. #define DEBUG_STATS     0x100000
  185. #define DEBUG_WM        0x400000
  186. #define DEBUG_URB       0x800000
  187. #define DEBUG_VS        0x1000000
  188. #define DEBUG_CLIP      0x2000000
  189. #define DEBUG_AUB       0x4000000
  190. #define DEBUG_SHADER_TIME 0x8000000
  191. #define DEBUG_BLORP     0x10000000
  192. #define DEBUG_NO16      0x20000000
  193.  
  194. #ifdef HAVE_ANDROID_PLATFORM
  195. #define LOG_TAG "INTEL-MESA"
  196. #include <cutils/log.h>
  197. #ifndef ALOGW
  198. #define ALOGW LOGW
  199. #endif
  200. #define dbg_printf(...) ALOGW(__VA_ARGS__)
  201. #else
  202. #define dbg_printf(...) printf(__VA_ARGS__)
  203. #endif /* HAVE_ANDROID_PLATFORM */
  204.  
  205. #define DBG(...) do {                                           \
  206.         if (unlikely(INTEL_DEBUG & FILE_DEBUG_FLAG))            \
  207.                 dbg_printf(__VA_ARGS__);                        \
  208. } while(0)
  209.  
  210. #define perf_debug(...) do {                                    \
  211.    static GLuint msg_id = 0;                                    \
  212.    if (unlikely(INTEL_DEBUG & DEBUG_PERF))                      \
  213.       dbg_printf(__VA_ARGS__);                                  \
  214.    if (brw->perf_debug)                                         \
  215.       _mesa_gl_debug(&brw->ctx, &msg_id,                        \
  216.                      MESA_DEBUG_TYPE_PERFORMANCE,               \
  217.                      MESA_DEBUG_SEVERITY_MEDIUM,                \
  218.                      __VA_ARGS__);                              \
  219. } while(0)
  220.  
  221. #define WARN_ONCE(cond, fmt...) do {                            \
  222.    if (unlikely(cond)) {                                        \
  223.       static bool _warned = false;                              \
  224.       static GLuint msg_id = 0;                                 \
  225.       if (!_warned) {                                           \
  226.          fprintf(stderr, "WARNING: ");                          \
  227.          fprintf(stderr, fmt);                                  \
  228.          _warned = true;                                        \
  229.                                                                 \
  230.          _mesa_gl_debug(ctx, &msg_id,                           \
  231.                         MESA_DEBUG_TYPE_OTHER,                  \
  232.                         MESA_DEBUG_SEVERITY_HIGH, fmt);         \
  233.       }                                                         \
  234.    }                                                            \
  235. } while (0)
  236.  
  237. /* ================================================================
  238.  * intel_context.c:
  239.  */
  240.  
  241. extern bool intelInitContext(struct brw_context *brw,
  242.                              int api,
  243.                              unsigned major_version,
  244.                              unsigned minor_version,
  245.                              const struct gl_config * mesaVis,
  246.                              __DRIcontext * driContextPriv,
  247.                              void *sharedContextPrivate,
  248.                              struct dd_function_table *functions,
  249.                              unsigned *dri_ctx_error);
  250.  
  251. extern void intelFinish(struct gl_context * ctx);
  252. extern void _intel_flush(struct gl_context * ctx, const char *file, int line);
  253.  
  254. #define intel_flush(ctx) _intel_flush(ctx, __FILE__, __LINE__)
  255.  
  256. extern void intelInitDriverFunctions(struct dd_function_table *functions);
  257.  
  258. void intel_init_syncobj_functions(struct dd_function_table *functions);
  259.  
  260. enum {
  261.    DRI_CONF_BO_REUSE_DISABLED,
  262.    DRI_CONF_BO_REUSE_ALL
  263. };
  264.  
  265. extern int intel_translate_shadow_compare_func(GLenum func);
  266. extern int intel_translate_compare_func(GLenum func);
  267. extern int intel_translate_stencil_op(GLenum op);
  268. extern int intel_translate_logic_op(GLenum opcode);
  269.  
  270. void intel_update_renderbuffers(__DRIcontext *context,
  271.                                 __DRIdrawable *drawable);
  272. void intel_prepare_render(struct brw_context *brw);
  273.  
  274. void
  275. intel_resolve_for_dri2_flush(struct brw_context *brw,
  276.                              __DRIdrawable *drawable);
  277.  
  278. extern void
  279. intelInitExtensions(struct gl_context *ctx);
  280. extern void
  281. intelInitClearFuncs(struct dd_function_table *functions);
  282.  
  283. static INLINE bool
  284. is_power_of_two(uint32_t value)
  285. {
  286.    return (value & (value - 1)) == 0;
  287. }
  288.  
  289. #ifdef __cplusplus
  290. }
  291. #endif
  292.  
  293. #endif
  294.