nasty commit with a bunch of test code left in, will clean up and pr
Remove the logger_ != nullptr check from shouldlog, it will nearly always be true except on initialization and gets checked later anyway, this shrinks the size of the generated code for some Select specialized vastcpy for current cpu, for now only have paths for MOVDIR64B and generic avx1 Add XE_UNLIKELY/LIKELY if, they map better to the c++ unlikely/likely attributes which we will need to use soon Finished reimplementing STVL/STVR/LVL/LVR as their own opcodes. we now generate far less code for these instructions. this also means optimization passes can be written to simplify/remove/replace these instructions in some cases. Found that a good deal of the X86 we were emitting for these instructions was dead code or redundant. the reduction in generated HIR/x86 should help a lot with compilation times and make function precompilation more feasible as a default Don't static assert in default prefetch impl, in c++20 the assertion will be triggered even without an instantiation Reorder some if/else to prod msvc into ordering the branches optimally. it somewhat worked... Added some notes about which opcodes should be removed/refactored Dispatch in WriteRegister via vector compares for the bounds. still not very optimal, we ought to be checking whether any register in a range may be special A lot of work on trying to optimize writeregister, moved wraparound path into a noinline function based on profiling info Hoist the IsUcodeAnalyzed check out of AnalyzeShader, instead check it before each call. Profiler recorded many hits in the stack frame setup of the function, but none in the actual body of it, so the check is often true but the stack frame setup is run unconditionally Pre-check whether we're about to write a single register from a ring Replace more jump tables from draw_util/texture_info with popcnt based sparse indexing/bit tables/shuffle lookups Place the GPU register file on its own VAD/virtual allocation, it is no longer a member of graphics system
This commit is contained in:
@@ -53,6 +53,26 @@ inline bool IsPrimitiveLine(const RegisterFile& regs) {
|
||||
regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type);
|
||||
}
|
||||
|
||||
constexpr uint32_t EncodeIsPrimitivePolygonalTable() {
|
||||
unsigned result = 0;
|
||||
#define TRUEFOR(x) \
|
||||
result |= 1U << static_cast<uint32_t>(xenos::PrimitiveType::x)
|
||||
|
||||
TRUEFOR(kTriangleList);
|
||||
TRUEFOR(kTriangleFan);
|
||||
TRUEFOR(kTriangleStrip);
|
||||
TRUEFOR(kTriangleWithWFlags);
|
||||
TRUEFOR(kQuadList);
|
||||
TRUEFOR(kQuadStrip);
|
||||
TRUEFOR(kPolygon);
|
||||
#undef TRUEFOR
|
||||
// TODO(Triang3l): Investigate how kRectangleList should be treated - possibly
|
||||
// actually drawn as two polygons on the console, however, the current
|
||||
// geometry shader doesn't care about the winding order - allowing backface
|
||||
// culling for rectangles currently breaks 4D53082D.
|
||||
return result;
|
||||
}
|
||||
|
||||
// Polygonal primitive types (not including points and lines) are rasterized as
|
||||
// triangles, have front and back faces, and also support face culling and fill
|
||||
// modes (polymode_front_ptype, polymode_back_ptype). Other primitive types are
|
||||
@@ -61,6 +81,7 @@ inline bool IsPrimitiveLine(const RegisterFile& regs) {
|
||||
// GL_FRONT_AND_BACK, points and lines are still drawn), and may in some cases
|
||||
// use the "para" registers instead of "front" or "back" (for "parallelogram" -
|
||||
// like poly_offset_para_enable).
|
||||
XE_FORCEINLINE
|
||||
constexpr bool IsPrimitivePolygonal(bool vgt_output_path_is_tessellation_enable,
|
||||
xenos::PrimitiveType type) {
|
||||
if (vgt_output_path_is_tessellation_enable &&
|
||||
@@ -71,26 +92,15 @@ constexpr bool IsPrimitivePolygonal(bool vgt_output_path_is_tessellation_enable,
|
||||
// enough.
|
||||
return true;
|
||||
}
|
||||
switch (type) {
|
||||
case xenos::PrimitiveType::kTriangleList:
|
||||
case xenos::PrimitiveType::kTriangleFan:
|
||||
case xenos::PrimitiveType::kTriangleStrip:
|
||||
case xenos::PrimitiveType::kTriangleWithWFlags:
|
||||
case xenos::PrimitiveType::kQuadList:
|
||||
case xenos::PrimitiveType::kQuadStrip:
|
||||
case xenos::PrimitiveType::kPolygon:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// TODO(Triang3l): Investigate how kRectangleList should be treated - possibly
|
||||
// actually drawn as two polygons on the console, however, the current
|
||||
// geometry shader doesn't care about the winding order - allowing backface
|
||||
// culling for rectangles currently breaks 4D53082D.
|
||||
return false;
|
||||
}
|
||||
// chrispy: expensive jumptable, use bit table instead
|
||||
|
||||
inline bool IsPrimitivePolygonal(const RegisterFile& regs) {
|
||||
constexpr uint32_t primitive_polygonal_table =
|
||||
EncodeIsPrimitivePolygonalTable();
|
||||
|
||||
return (primitive_polygonal_table & (1U << static_cast<uint32_t>(type))) != 0;
|
||||
}
|
||||
XE_FORCEINLINE
|
||||
bool IsPrimitivePolygonal(const RegisterFile& regs) {
|
||||
return IsPrimitivePolygonal(
|
||||
regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select ==
|
||||
xenos::VGTOutputPath::kTessellationEnable,
|
||||
|
||||
Reference in New Issue
Block a user