Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 2013 LunarG, Inc.
  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 shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  *
  24.  * Authors:
  25.  *    Chia-I Wu <olv@lunarg.com>
  26.  */
  27.  
  28. #ifndef ILO_3D_PIPELINE_H
  29. #define ILO_3D_PIPELINE_H
  30.  
  31. #include "ilo_common.h"
  32. #include "ilo_context.h"
  33. #include "ilo_gpe_gen6.h"
  34. #include "ilo_gpe_gen7.h"
  35.  
  36. struct intel_bo;
  37. struct ilo_cp;
  38. struct ilo_context;
  39.  
  40. enum ilo_3d_pipeline_invalidate_flags {
  41.    ILO_3D_PIPELINE_INVALIDATE_HW         = 1 << 0,
  42.    ILO_3D_PIPELINE_INVALIDATE_BATCH_BO   = 1 << 1,
  43.    ILO_3D_PIPELINE_INVALIDATE_STATE_BO   = 1 << 2,
  44.    ILO_3D_PIPELINE_INVALIDATE_KERNEL_BO  = 1 << 3,
  45.  
  46.    ILO_3D_PIPELINE_INVALIDATE_ALL        = 0xffffffff,
  47. };
  48.  
  49. enum ilo_3d_pipeline_action {
  50.    ILO_3D_PIPELINE_DRAW,
  51.    ILO_3D_PIPELINE_FLUSH,
  52.    ILO_3D_PIPELINE_WRITE_TIMESTAMP,
  53.    ILO_3D_PIPELINE_WRITE_DEPTH_COUNT,
  54. };
  55.  
  56. /**
  57.  * 3D pipeline.
  58.  */
  59. struct ilo_3d_pipeline {
  60.    struct ilo_cp *cp;
  61.    const struct ilo_dev_info *dev;
  62.  
  63.    uint32_t invalidate_flags;
  64.  
  65.    struct intel_bo *workaround_bo;
  66.  
  67.    uint32_t packed_sample_position_1x;
  68.    uint32_t packed_sample_position_4x;
  69.    uint32_t packed_sample_position_8x[2];
  70.  
  71.    int (*estimate_size)(struct ilo_3d_pipeline *pipeline,
  72.                         enum ilo_3d_pipeline_action action,
  73.                         const void *arg);
  74.  
  75.    void (*emit_draw)(struct ilo_3d_pipeline *pipeline,
  76.                      const struct ilo_context *ilo);
  77.  
  78.    void (*emit_flush)(struct ilo_3d_pipeline *pipeline);
  79.  
  80.    void (*emit_write_timestamp)(struct ilo_3d_pipeline *pipeline,
  81.                                 struct intel_bo *bo, int index);
  82.  
  83.    void (*emit_write_depth_count)(struct ilo_3d_pipeline *pipeline,
  84.                                   struct intel_bo *bo, int index);
  85.  
  86.    /**
  87.     * all GPE functions of all GENs
  88.     */
  89. #define GEN6_EMIT(name) ilo_gpe_gen6_ ## name gen6_ ## name
  90.    GEN6_EMIT(STATE_BASE_ADDRESS);
  91.    GEN6_EMIT(STATE_SIP);
  92.    GEN6_EMIT(PIPELINE_SELECT);
  93.    GEN6_EMIT(3DSTATE_BINDING_TABLE_POINTERS);
  94.    GEN6_EMIT(3DSTATE_SAMPLER_STATE_POINTERS);
  95.    GEN6_EMIT(3DSTATE_URB);
  96.    GEN6_EMIT(3DSTATE_VERTEX_BUFFERS);
  97.    GEN6_EMIT(3DSTATE_VERTEX_ELEMENTS);
  98.    GEN6_EMIT(3DSTATE_INDEX_BUFFER);
  99.    GEN6_EMIT(3DSTATE_VF_STATISTICS);
  100.    GEN6_EMIT(3DSTATE_VIEWPORT_STATE_POINTERS);
  101.    GEN6_EMIT(3DSTATE_CC_STATE_POINTERS);
  102.    GEN6_EMIT(3DSTATE_SCISSOR_STATE_POINTERS);
  103.    GEN6_EMIT(3DSTATE_VS);
  104.    GEN6_EMIT(3DSTATE_GS);
  105.    GEN6_EMIT(3DSTATE_CLIP);
  106.    GEN6_EMIT(3DSTATE_SF);
  107.    GEN6_EMIT(3DSTATE_WM);
  108.    GEN6_EMIT(3DSTATE_CONSTANT_VS);
  109.    GEN6_EMIT(3DSTATE_CONSTANT_GS);
  110.    GEN6_EMIT(3DSTATE_CONSTANT_PS);
  111.    GEN6_EMIT(3DSTATE_SAMPLE_MASK);
  112.    GEN6_EMIT(3DSTATE_DRAWING_RECTANGLE);
  113.    GEN6_EMIT(3DSTATE_DEPTH_BUFFER);
  114.    GEN6_EMIT(3DSTATE_POLY_STIPPLE_OFFSET);
  115.    GEN6_EMIT(3DSTATE_POLY_STIPPLE_PATTERN);
  116.    GEN6_EMIT(3DSTATE_LINE_STIPPLE);
  117.    GEN6_EMIT(3DSTATE_AA_LINE_PARAMETERS);
  118.    GEN6_EMIT(3DSTATE_GS_SVB_INDEX);
  119.    GEN6_EMIT(3DSTATE_MULTISAMPLE);
  120.    GEN6_EMIT(3DSTATE_STENCIL_BUFFER);
  121.    GEN6_EMIT(3DSTATE_HIER_DEPTH_BUFFER);
  122.    GEN6_EMIT(3DSTATE_CLEAR_PARAMS);
  123.    GEN6_EMIT(PIPE_CONTROL);
  124.    GEN6_EMIT(3DPRIMITIVE);
  125.    GEN6_EMIT(INTERFACE_DESCRIPTOR_DATA);
  126.    GEN6_EMIT(SF_VIEWPORT);
  127.    GEN6_EMIT(CLIP_VIEWPORT);
  128.    GEN6_EMIT(CC_VIEWPORT);
  129.    GEN6_EMIT(COLOR_CALC_STATE);
  130.    GEN6_EMIT(BLEND_STATE);
  131.    GEN6_EMIT(DEPTH_STENCIL_STATE);
  132.    GEN6_EMIT(SCISSOR_RECT);
  133.    GEN6_EMIT(BINDING_TABLE_STATE);
  134.    GEN6_EMIT(SURFACE_STATE);
  135.    GEN6_EMIT(so_SURFACE_STATE);
  136.    GEN6_EMIT(SAMPLER_STATE);
  137.    GEN6_EMIT(SAMPLER_BORDER_COLOR_STATE);
  138.    GEN6_EMIT(push_constant_buffer);
  139. #undef GEN6_EMIT
  140.  
  141. #define GEN7_EMIT(name) ilo_gpe_gen7_ ## name gen7_ ## name
  142.    GEN7_EMIT(3DSTATE_DEPTH_BUFFER);
  143.    GEN7_EMIT(3DSTATE_CC_STATE_POINTERS);
  144.    GEN7_EMIT(3DSTATE_GS);
  145.    GEN7_EMIT(3DSTATE_SF);
  146.    GEN7_EMIT(3DSTATE_WM);
  147.    GEN7_EMIT(3DSTATE_SAMPLE_MASK);
  148.    GEN7_EMIT(3DSTATE_CONSTANT_HS);
  149.    GEN7_EMIT(3DSTATE_CONSTANT_DS);
  150.    GEN7_EMIT(3DSTATE_HS);
  151.    GEN7_EMIT(3DSTATE_TE);
  152.    GEN7_EMIT(3DSTATE_DS);
  153.    GEN7_EMIT(3DSTATE_STREAMOUT);
  154.    GEN7_EMIT(3DSTATE_SBE);
  155.    GEN7_EMIT(3DSTATE_PS);
  156.    GEN7_EMIT(3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP);
  157.    GEN7_EMIT(3DSTATE_VIEWPORT_STATE_POINTERS_CC);
  158.    GEN7_EMIT(3DSTATE_BLEND_STATE_POINTERS);
  159.    GEN7_EMIT(3DSTATE_DEPTH_STENCIL_STATE_POINTERS);
  160.    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_VS);
  161.    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_HS);
  162.    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_DS);
  163.    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_GS);
  164.    GEN7_EMIT(3DSTATE_BINDING_TABLE_POINTERS_PS);
  165.    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_VS);
  166.    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_HS);
  167.    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_DS);
  168.    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_GS);
  169.    GEN7_EMIT(3DSTATE_SAMPLER_STATE_POINTERS_PS);
  170.    GEN7_EMIT(3DSTATE_URB_VS);
  171.    GEN7_EMIT(3DSTATE_URB_HS);
  172.    GEN7_EMIT(3DSTATE_URB_DS);
  173.    GEN7_EMIT(3DSTATE_URB_GS);
  174.    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_VS);
  175.    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_HS);
  176.    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_DS);
  177.    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_GS);
  178.    GEN7_EMIT(3DSTATE_PUSH_CONSTANT_ALLOC_PS);
  179.    GEN7_EMIT(3DSTATE_SO_DECL_LIST);
  180.    GEN7_EMIT(3DSTATE_SO_BUFFER);
  181.    GEN7_EMIT(SF_CLIP_VIEWPORT);
  182. #undef GEN7_EMIT
  183.  
  184.    /**
  185.     * HW states.
  186.     */
  187.    struct ilo_3d_pipeline_state {
  188.       bool has_gen6_wa_pipe_control;
  189.  
  190.       bool primitive_restart;
  191.       int reduced_prim;
  192.       int so_num_vertices, so_max_vertices;
  193.  
  194.       uint32_t SF_VIEWPORT;
  195.       uint32_t CLIP_VIEWPORT;
  196.       uint32_t SF_CLIP_VIEWPORT; /* GEN7+ */
  197.       uint32_t CC_VIEWPORT;
  198.  
  199.       uint32_t COLOR_CALC_STATE;
  200.       uint32_t BLEND_STATE;
  201.       uint32_t DEPTH_STENCIL_STATE;
  202.  
  203.       uint32_t SCISSOR_RECT;
  204.  
  205.       struct {
  206.          uint32_t BINDING_TABLE_STATE;
  207.          int BINDING_TABLE_STATE_size;
  208.          uint32_t SURFACE_STATE[ILO_MAX_VS_SURFACES];
  209.          uint32_t SAMPLER_STATE;
  210.          uint32_t SAMPLER_BORDER_COLOR_STATE[ILO_MAX_SAMPLERS];
  211.          uint32_t PUSH_CONSTANT_BUFFER;
  212.          int PUSH_CONSTANT_BUFFER_size;
  213.       } vs;
  214.  
  215.       struct {
  216.          uint32_t BINDING_TABLE_STATE;
  217.          int BINDING_TABLE_STATE_size;
  218.          uint32_t SURFACE_STATE[ILO_MAX_GS_SURFACES];
  219.          bool active;
  220.       } gs;
  221.  
  222.       struct {
  223.          uint32_t BINDING_TABLE_STATE;
  224.          int BINDING_TABLE_STATE_size;
  225.          uint32_t SURFACE_STATE[ILO_MAX_WM_SURFACES];
  226.          uint32_t SAMPLER_STATE;
  227.          uint32_t SAMPLER_BORDER_COLOR_STATE[ILO_MAX_SAMPLERS];
  228.       } wm;
  229.    } state;
  230. };
  231.  
  232. struct ilo_3d_pipeline *
  233. ilo_3d_pipeline_create(struct ilo_cp *cp, const struct ilo_dev_info *dev);
  234.  
  235. void
  236. ilo_3d_pipeline_destroy(struct ilo_3d_pipeline *pipeline);
  237.  
  238.  
  239. static inline void
  240. ilo_3d_pipeline_invalidate(struct ilo_3d_pipeline *p, uint32_t flags)
  241. {
  242.    p->invalidate_flags |= flags;
  243. }
  244.  
  245. /**
  246.  * Estimate the size of an action.
  247.  */
  248. static inline int
  249. ilo_3d_pipeline_estimate_size(struct ilo_3d_pipeline *pipeline,
  250.                               enum ilo_3d_pipeline_action action,
  251.                               const void *arg)
  252. {
  253.    return pipeline->estimate_size(pipeline, action, arg);
  254. }
  255.  
  256. bool
  257. ilo_3d_pipeline_emit_draw(struct ilo_3d_pipeline *p,
  258.                           const struct ilo_context *ilo,
  259.                           int *prim_generated, int *prim_emitted);
  260.  
  261. void
  262. ilo_3d_pipeline_emit_flush(struct ilo_3d_pipeline *p);
  263.  
  264. void
  265. ilo_3d_pipeline_emit_write_timestamp(struct ilo_3d_pipeline *p,
  266.                                      struct intel_bo *bo, int index);
  267.  
  268. void
  269. ilo_3d_pipeline_emit_write_depth_count(struct ilo_3d_pipeline *p,
  270.                                        struct intel_bo *bo, int index);
  271.  
  272. void
  273. ilo_3d_pipeline_get_sample_position(struct ilo_3d_pipeline *p,
  274.                                     unsigned sample_count,
  275.                                     unsigned sample_index,
  276.                                     float *x, float *y);
  277.  
  278. void
  279. ilo_3d_pipeline_dump(struct ilo_3d_pipeline *p);
  280.  
  281. #endif /* ILO_3D_PIPELINE_H */
  282.