#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 {
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);
/*
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:
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