Subversion Repositories Kolibri OS

Rev

Rev 4358 | 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 "pipe/p_state.h"
  37. #include "util/u_debug.h"
  38. #include "util/u_math.h"
  39. #include "util/u_half.h"
  40.  
  41. #include "adreno_common.xml.h"
  42. #include "adreno_pm4.xml.h"
  43.  
  44. enum adreno_rb_depth_format fd_pipe2depth(enum pipe_format format);
  45. enum pc_di_index_size fd_pipe2index(enum pipe_format format);
  46. enum adreno_rb_blend_factor fd_blend_factor(unsigned factor);
  47. enum adreno_rb_blend_opcode fd_blend_func(unsigned func);
  48. enum adreno_pa_su_sc_draw fd_polygon_mode(unsigned mode);
  49. enum adreno_stencil_op fd_stencil_op(unsigned op);
  50.  
  51.  
  52. #define FD_DBG_MSGS     0x01
  53. #define FD_DBG_DISASM   0x02
  54. #define FD_DBG_DCLEAR   0x04
  55. #define FD_DBG_DGMEM    0x08
  56. #define FD_DBG_DSCIS    0x10
  57. extern int fd_mesa_debug;
  58.  
  59. #define DBG(fmt, ...) \
  60.                 do { if (fd_mesa_debug & FD_DBG_MSGS) \
  61.                         debug_printf("%s:%d: "fmt "\n", \
  62.                                 __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
  63.  
  64. #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
  65.  
  66. /* for conditionally setting boolean flag(s): */
  67. #define COND(bool, val) ((bool) ? (val) : 0)
  68.  
  69. #define CP_REG(reg) ((0x4 << 16) | ((unsigned int)((reg) - (0x2000))))
  70.  
  71. static inline uint32_t DRAW(enum pc_di_primtype prim_type,
  72.                 enum pc_di_src_sel source_select, enum pc_di_index_size index_size,
  73.                 enum pc_di_vis_cull_mode vis_cull_mode)
  74. {
  75.         return (prim_type         << 0) |
  76.                         (source_select     << 6) |
  77.                         ((index_size & 1)  << 11) |
  78.                         ((index_size >> 1) << 13) |
  79.                         (vis_cull_mode     << 9) |
  80.                         (1                 << 14);
  81. }
  82.  
  83.  
  84. static inline enum pipe_format
  85. pipe_surface_format(struct pipe_surface *psurf)
  86. {
  87.         if (!psurf)
  88.                 return PIPE_FORMAT_NONE;
  89.         return psurf->format;
  90. }
  91.  
  92. #define LOG_DWORDS 0
  93.  
  94.  
  95. static inline void
  96. OUT_RING(struct fd_ringbuffer *ring, uint32_t data)
  97. {
  98.         if (LOG_DWORDS) {
  99.                 DBG("ring[%p]: OUT_RING   %04x:  %08x", ring,
  100.                                 (uint32_t)(ring->cur - ring->last_start), data);
  101.         }
  102.         *(ring->cur++) = data;
  103. }
  104.  
  105. static inline void
  106. OUT_RELOC(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_RELOC   %04x:  %p+%u << %d", ring,
  111.                                 (uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
  112.         }
  113.         fd_ringbuffer_reloc(ring, &(struct fd_reloc){
  114.                 .bo = bo,
  115.                 .flags = FD_RELOC_READ,
  116.                 .offset = offset,
  117.                 .or = or,
  118.                 .shift = shift,
  119.         });
  120. }
  121.  
  122. static inline void
  123. OUT_RELOCW(struct fd_ringbuffer *ring, struct fd_bo *bo,
  124.                 uint32_t offset, uint32_t or, int32_t shift)
  125. {
  126.         if (LOG_DWORDS) {
  127.                 DBG("ring[%p]: OUT_RELOC   %04x:  %p+%u << %d", ring,
  128.                                 (uint32_t)(ring->cur - ring->last_start), bo, offset, shift);
  129.         }
  130.         fd_ringbuffer_reloc(ring, &(struct fd_reloc){
  131.                 .bo = bo,
  132.                 .flags = FD_RELOC_READ | FD_RELOC_WRITE,
  133.                 .offset = offset,
  134.                 .or = or,
  135.                 .shift = shift,
  136.         });
  137. }
  138.  
  139. static inline void BEGIN_RING(struct fd_ringbuffer *ring, uint32_t ndwords)
  140. {
  141.         if ((ring->cur + ndwords) >= ring->end) {
  142.                 /* this probably won't really work if we have multiple tiles..
  143.                  * but it is ok for 2d..  we might need different behavior
  144.                  * depending on 2d or 3d pipe.
  145.                  */
  146.                 DBG("uh oh..");
  147.         }
  148. }
  149.  
  150. static inline void
  151. OUT_PKT0(struct fd_ringbuffer *ring, uint16_t regindx, uint16_t cnt)
  152. {
  153.         BEGIN_RING(ring, cnt+1);
  154.         OUT_RING(ring, CP_TYPE0_PKT | ((cnt-1) << 16) | (regindx & 0x7FFF));
  155. }
  156.  
  157. static inline void
  158. OUT_PKT3(struct fd_ringbuffer *ring, uint8_t opcode, uint16_t cnt)
  159. {
  160.         BEGIN_RING(ring, cnt+1);
  161.         OUT_RING(ring, CP_TYPE3_PKT | ((cnt-1) << 16) | ((opcode & 0xFF) << 8));
  162. }
  163.  
  164. static inline void
  165. OUT_IB(struct fd_ringbuffer *ring, struct fd_ringmarker *start,
  166.                 struct fd_ringmarker *end)
  167. {
  168.         OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2);
  169.         fd_ringbuffer_emit_reloc_ring(ring, start, end);
  170.         OUT_RING(ring, fd_ringmarker_dwords(start, end));
  171. }
  172.  
  173. #endif /* FREEDRENO_UTIL_H_ */
  174.