Subversion Repositories Kolibri OS

Rev

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

  1. /* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */
  2.  
  3. /*
  4.  * Copyright (C) 2012 Rob Clark <robclark@freedesktop.org>
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice (including the next
  14.  * paragraph) shall be included in all copies or substantial portions of the
  15.  * Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23.  * SOFTWARE.
  24.  *
  25.  * Authors:
  26.  *    Rob Clark <robclark@freedesktop.org>
  27.  */
  28.  
  29. #ifndef FREEDRENO_UTIL_H_
  30. #define FREEDRENO_UTIL_H_
  31.  
  32. #include <freedreno_drmif.h>
  33. #include <freedreno_ringbuffer.h>
  34.  
  35. #include "pipe/p_format.h"
  36. #include "util/u_debug.h"
  37. #include "util/u_math.h"
  38.  
  39. #include "adreno_common.xml.h"
  40. #include "adreno_pm4.xml.h"
  41.  
  42. enum adreno_rb_depth_format fd_pipe2depth(enum pipe_format format);
  43. enum pc_di_index_size fd_pipe2index(enum pipe_format format);
  44. enum adreno_rb_blend_factor fd_blend_factor(unsigned factor);
  45. enum adreno_rb_blend_opcode fd_blend_func(unsigned func);
  46. enum adreno_pa_su_sc_draw fd_polygon_mode(unsigned mode);
  47. enum adreno_stencil_op fd_stencil_op(unsigned op);
  48.  
  49.  
  50. #define FD_DBG_MSGS   0x1
  51. #define FD_DBG_DISASM 0x2
  52. #define FD_DBG_DCLEAR 0x4
  53. #define FD_DBG_DGMEM  0x8
  54. extern int fd_mesa_debug;
  55.  
  56. #define DBG(fmt, ...) \
  57.                 do { if (fd_mesa_debug & FD_DBG_MSGS) \
  58.                         debug_printf("%s:%d: "fmt "\n", \
  59.                                 __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
  60.  
  61. #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
  62.  
  63. /* for conditionally setting boolean flag(s): */
  64. #define COND(bool, val) ((bool) ? (val) : 0)
  65.  
  66. #define CP_REG(reg) ((0x4 << 16) | ((unsigned int)((reg) - (0x2000))))
  67.  
  68. static inline uint32_t DRAW(enum pc_di_primtype prim_type,
  69.                 enum pc_di_src_sel source_select, enum pc_di_index_size index_size,
  70.                 enum pc_di_vis_cull_mode vis_cull_mode)
  71. {
  72.         return (prim_type         << 0) |
  73.                         (source_select     << 6) |
  74.                         ((index_size & 1)  << 11) |
  75.                         ((index_size >> 1) << 13) |
  76.                         (vis_cull_mode     << 9) |
  77.                         (1                 << 14);
  78. }
  79.  
  80. #define LOG_DWORDS 0
  81.  
  82.  
  83. static inline void
  84. OUT_RING(struct fd_ringbuffer *ring, uint32_t data)
  85. {
  86.         if (LOG_DWORDS) {
  87.                 DBG("ring[%p]: OUT_RING   %04x:  %08x", ring,
  88.                                 (uint32_t)(ring->cur - ring->last_start), data);
  89.         }
  90.         *(ring->cur++) = data;
  91. }
  92.  
  93. static inline void
  94. OUT_RELOC(struct fd_ringbuffer *ring, struct fd_bo *bo,
  95.                 uint32_t offset, uint32_t or)
  96. {
  97.         if (LOG_DWORDS) {
  98.                 DBG("ring[%p]: OUT_RELOC  %04x:  %p+%u", ring,
  99.                                 (uint32_t)(ring->cur - ring->last_start), bo, offset);
  100.         }
  101.         fd_ringbuffer_emit_reloc(ring, bo, offset, or);
  102. }
  103.  
  104. /* shifted reloc: */
  105. static inline void
  106. OUT_RELOCS(struct fd_ringbuffer *ring, struct fd_bo *bo,
  107.                 uint32_t offset, uint32_t or, int32_t shift)
  108. {
  109.         if (LOG_DWORDS) {
  110.                 DBG("ring[%p]: OUT_RELOCS  %04x:  %p+%u << %d", ring,
  111.                                 (uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
  112.         }
  113.         fd_ringbuffer_emit_reloc_shift(ring, bo, offset, or, shift);
  114. }
  115.  
  116. static inline void BEGIN_RING(struct fd_ringbuffer *ring, uint32_t ndwords)
  117. {
  118.         if ((ring->cur + ndwords) >= ring->end) {
  119.                 /* this probably won't really work if we have multiple tiles..
  120.                  * but it is ok for 2d..  we might need different behavior
  121.                  * depending on 2d or 3d pipe.
  122.                  */
  123.                 DBG("uh oh..");
  124.         }
  125. }
  126.  
  127. static inline void
  128. OUT_PKT0(struct fd_ringbuffer *ring, uint16_t regindx, uint16_t cnt)
  129. {
  130.         BEGIN_RING(ring, cnt+1);
  131.         OUT_RING(ring, CP_TYPE0_PKT | ((cnt-1) << 16) | (regindx & 0x7FFF));
  132. }
  133.  
  134. static inline void
  135. OUT_PKT3(struct fd_ringbuffer *ring, uint8_t opcode, uint16_t cnt)
  136. {
  137.         BEGIN_RING(ring, cnt+1);
  138.         OUT_RING(ring, CP_TYPE3_PKT | ((cnt-1) << 16) | ((opcode & 0xFF) << 8));
  139. }
  140.  
  141. static inline void
  142. OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start,
  143.                 struct fd_ringmarker *end)
  144. {
  145.         OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2);
  146.         fd_ringbuffer_emit_reloc_ring(ring, start);
  147.         OUT_RING(ring, fd_ringmarker_dwords(start, end));
  148. }
  149.  
  150. #endif /* FREEDRENO_UTIL_H_ */
  151.