swr: fix build with mingw
[mesa.git] / src / gallium / drivers / swr / swr_state.h
index a2b4d808aa3534d24a3597d14aadb80e506c0d39..128b85a892b3f3ab01089e38bca892577f16fa28 100644 (file)
 #include "tgsi/tgsi_scan.h"
 #include "tgsi/tgsi_parse.h"
 #include "tgsi/tgsi_dump.h"
+#include "gallivm/lp_bld_init.h"
 #include "gallivm/lp_bld_tgsi.h"
-#include "util/u_hash.h"
+#include "util/crc32.h"
 #include "api.h"
 #include "swr_tex_sample.h"
 #include "swr_shader.h"
 #include <unordered_map>
+#include <memory>
+
+template <typename T>
+struct ShaderVariant {
+   struct gallivm_state *gallivm;
+   T shader;
+
+   ShaderVariant(struct gallivm_state *gs, T code) : gallivm(gs), shader(code) {}
+   ~ShaderVariant() { gallivm_destroy(gallivm); }
+};
+
+using PFN_TCS_FUNC = PFN_HS_FUNC;
+using PFN_TES_FUNC = PFN_DS_FUNC;
+
+typedef ShaderVariant<PFN_VERTEX_FUNC> VariantVS;
+typedef ShaderVariant<PFN_PIXEL_KERNEL> VariantFS;
+typedef ShaderVariant<PFN_GS_FUNC> VariantGS;
+typedef ShaderVariant<PFN_TCS_FUNC> VariantTCS;
+typedef ShaderVariant<PFN_TES_FUNC> VariantTES;
 
 /* skeleton */
 struct swr_vertex_shader {
    struct pipe_shader_state pipe;
    struct lp_tgsi_info info;
-   unsigned linkageMask;
-   PFN_VERTEX_FUNC func;
+   std::unordered_map<swr_jit_vs_key, std::unique_ptr<VariantVS>> map;
    SWR_STREAMOUT_STATE soState;
-   PFN_SO_FUNC soFunc[PIPE_PRIM_MAX];
+   PFN_SO_FUNC soFunc[PIPE_PRIM_MAX] {0};
 };
 
 struct swr_fragment_shader {
    struct pipe_shader_state pipe;
    struct lp_tgsi_info info;
    uint32_t constantMask;
+   uint32_t flatConstantMask;
    uint32_t pointSpriteMask;
-   std::unordered_map<swr_jit_key, PFN_PIXEL_KERNEL> map;
+   std::unordered_map<swr_jit_fs_key, std::unique_ptr<VariantFS>> map;
+};
+
+struct swr_geometry_shader {
+   struct pipe_shader_state pipe;
+   struct lp_tgsi_info info;
+   SWR_GS_STATE gsState;
+
+   std::unordered_map<swr_jit_gs_key, std::unique_ptr<VariantGS>> map;
+};
+
+struct swr_tess_control_shader {
+   struct pipe_shader_state pipe;
+   struct lp_tgsi_info info;
+   uint32_t vertices_per_patch;
+
+   std::unordered_map<swr_jit_tcs_key, std::unique_ptr<VariantTCS>> map;
+};
+
+struct swr_tess_evaluation_shader {
+   struct pipe_shader_state pipe;
+   struct lp_tgsi_info info;
+   SWR_TS_STATE ts_state;
+
+   std::unordered_map<swr_jit_tes_key, std::unique_ptr<VariantTES>> map;
 };
 
+
 /* Vertex element state */
 struct swr_vertex_element_state {
    FETCH_COMPILE_STATE fsState;
-   PFN_FETCH_FUNC fsFunc;
-   uint32_t stream_pitch[PIPE_MAX_ATTRIBS];
+   PFN_FETCH_FUNC fsFunc {NULL};
+   uint32_t stream_pitch[PIPE_MAX_ATTRIBS] {0};
+   uint32_t min_instance_div[PIPE_MAX_ATTRIBS] {0};
+   uint32_t instanced_bufs {0};
+   std::unordered_map<swr_jit_fetch_key, PFN_FETCH_FUNC> map;
 };
 
 struct swr_blend_state {
@@ -66,17 +114,22 @@ struct swr_blend_state {
    RENDER_TARGET_BLEND_COMPILE_STATE compileState[PIPE_MAX_COLOR_BUFS];
 };
 
+struct swr_poly_stipple {
+   struct pipe_poly_stipple pipe;
+   bool prim_is_poly;
+};
+
 /*
  * Derived SWR API DrawState
  * For convenience of making simple changes without re-deriving state.
  */
 struct swr_derived_state {
    SWR_RASTSTATE rastState;
-   SWR_VIEWPORT vp;
-   SWR_VIEWPORT_MATRIX vpm;
+   SWR_VIEWPORT vp[KNOB_NUM_VIEWPORTS_SCISSORS];
+   SWR_VIEWPORT_MATRICES vpm;
 };
 
-void swr_update_derived(struct swr_context *,
+void swr_update_derived(struct pipe_context *,
                         const struct pipe_draw_info * = nullptr);
 
 /*
@@ -92,7 +145,7 @@ swr_convert_logic_op(const UINT op)
    case PIPE_LOGICOP_NOR:
       return LOGICOP_NOR;
    case PIPE_LOGICOP_AND_INVERTED:
-      return LOGICOP_CLEAR;
+      return LOGICOP_AND_INVERTED;
    case PIPE_LOGICOP_COPY_INVERTED:
       return LOGICOP_COPY_INVERTED;
    case PIPE_LOGICOP_AND_REVERSE:
@@ -304,4 +357,69 @@ swr_convert_target_type(const enum pipe_texture_target target)
       return SURFACE_NULL;
    }
 }
+
+/*
+ * Convert mesa PIPE_PRIM_X to SWR enum PRIMITIVE_TOPOLOGY
+ */
+static INLINE enum PRIMITIVE_TOPOLOGY
+swr_convert_prim_topology(const unsigned mode, const unsigned tcs_verts)
+{
+   switch (mode) {
+   case PIPE_PRIM_POINTS:
+      return TOP_POINT_LIST;
+   case PIPE_PRIM_LINES:
+      return TOP_LINE_LIST;
+   case PIPE_PRIM_LINE_LOOP:
+      return TOP_LINE_LOOP;
+   case PIPE_PRIM_LINE_STRIP:
+      return TOP_LINE_STRIP;
+   case PIPE_PRIM_TRIANGLES:
+      return TOP_TRIANGLE_LIST;
+   case PIPE_PRIM_TRIANGLE_STRIP:
+      return TOP_TRIANGLE_STRIP;
+   case PIPE_PRIM_TRIANGLE_FAN:
+      return TOP_TRIANGLE_FAN;
+   case PIPE_PRIM_QUADS:
+      return TOP_QUAD_LIST;
+   case PIPE_PRIM_QUAD_STRIP:
+      return TOP_QUAD_STRIP;
+   case PIPE_PRIM_POLYGON:
+      return TOP_TRIANGLE_FAN; /* XXX TOP_POLYGON; */
+   case PIPE_PRIM_LINES_ADJACENCY:
+      return TOP_LINE_LIST_ADJ;
+   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
+      return TOP_LISTSTRIP_ADJ;
+   case PIPE_PRIM_TRIANGLES_ADJACENCY:
+      return TOP_TRI_LIST_ADJ;
+   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
+      return TOP_TRI_STRIP_ADJ;
+   case PIPE_PRIM_PATCHES:
+      // rasterizer has a separate type for each possible number of patch vertices
+      return (PRIMITIVE_TOPOLOGY)((unsigned)TOP_PATCHLIST_BASE + tcs_verts);
+   default:
+      assert(0 && "Unknown topology");
+      return TOP_UNKNOWN;
+   }
+};
+
+/*
+ * convert mesa PIPE_POLYGON_MODE_X to SWR enum SWR_FILLMODE
+ */
+static INLINE enum SWR_FILLMODE
+swr_convert_fill_mode(const unsigned mode)
+{
+   switch(mode) {
+   case PIPE_POLYGON_MODE_FILL:
+      return SWR_FILLMODE_SOLID;
+   case PIPE_POLYGON_MODE_LINE:
+      return SWR_FILLMODE_WIREFRAME;
+   case PIPE_POLYGON_MODE_POINT:
+      return SWR_FILLMODE_POINT;
+   default:
+      assert(0 && "Unknown fillmode");
+      return SWR_FILLMODE_SOLID; // at least do something sensible
+   }
+}
+
+
 #endif