nvk: Import 3D context init code from nouveau
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Tue, 31 Jan 2023 02:11:52 +0000 (20:11 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:31:56 +0000 (21:31 +0000)
We really should organize this better but at least we have it now.
This should pretty much be equivalent to what nouveau is doing on
screen/context create.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/vulkan/nvk_cmd_draw.c

index cc172e2..9a1e1bb 100644 (file)
@@ -1,9 +1,251 @@
 #include "nvk_cmd_buffer.h"
+#include "nvk_device.h"
+#include "nvk_physical_device.h"
+
+#include "nouveau_context.h"
+
+#include "nvk_cl9097.h"
+#include "nvk_cla097.h"
+#include "nvk_clb197.h"
+#include "nvk_clc397.h"
+#include "nvk_clc597.h"
+
+static inline uint16_t
+nvk_cmd_buffer_3d_cls(struct nvk_cmd_buffer *cmd)
+{
+   return nvk_cmd_buffer_device(cmd)->ctx->eng3d.cls;
+}
+
+static void
+magic_3d_init(struct nvk_cmd_buffer *cmd)
+{
+   struct nouveau_ws_push *p = cmd->push;
+
+   P_IMMD(p, NV9097, SET_REDUCE_COLOR_THRESHOLDS_UNORM8, {
+      .all_covered_all_hit_once = 0xff,
+   });
+   P_MTHD(p, NV9097, SET_REDUCE_COLOR_THRESHOLDS_UNORM10);
+   P_NV9097_SET_REDUCE_COLOR_THRESHOLDS_UNORM10(p, {
+      .all_covered_all_hit_once = 0xff,
+   });
+   P_NV9097_SET_REDUCE_COLOR_THRESHOLDS_UNORM16(p, {
+      .all_covered_all_hit_once = 0xff,
+   });
+   P_NV9097_SET_REDUCE_COLOR_THRESHOLDS_FP11(p, {
+      .all_covered_all_hit_once = 0x3f,
+   });
+   P_NV9097_SET_REDUCE_COLOR_THRESHOLDS_FP16(p, {
+      .all_covered_all_hit_once = 0xff,
+   });
+   P_NV9097_SET_REDUCE_COLOR_THRESHOLDS_SRGB8(p, {
+      .all_covered_all_hit_once = 0xff,
+   });
+   if (nvk_cmd_buffer_3d_cls(cmd) < VOLTA_A)
+      P_IMMD(p, NV9097, SET_ALPHA_FRACTION, 0x3f);
+
+   P_IMMD(p, NV9097, CHECK_SPH_VERSION, {
+      .current = 3,
+      .oldest_supported = 3,
+   });
+   P_IMMD(p, NV9097, CHECK_AAM_VERSION, {
+      .current = 2,
+      .oldest_supported = 2,
+   });
+
+   if (nvk_cmd_buffer_3d_cls(cmd) < VOLTA_A)
+      P_IMMD(p, NV9097, SET_SHADER_SCHEDULING, MODE_OLDEST_THREAD_FIRST);
+
+   P_IMMD(p, NV9097, SET_L2_CACHE_CONTROL_FOR_ROP_PREFETCH_READ_REQUESTS,
+                     POLICY_EVICT_NORMAL);
+   P_IMMD(p, NV9097, SET_L2_CACHE_CONTROL_FOR_ROP_NONINTERLOCKED_READ_REQUESTS,
+                     POLICY_EVICT_NORMAL);
+   P_IMMD(p, NV9097, SET_L2_CACHE_CONTROL_FOR_ROP_INTERLOCKED_READ_REQUESTS,
+                     POLICY_EVICT_NORMAL);
+   P_IMMD(p, NV9097, SET_L2_CACHE_CONTROL_FOR_ROP_NONINTERLOCKED_WRITE_REQUESTS,
+                     POLICY_EVICT_NORMAL);
+   P_IMMD(p, NV9097, SET_L2_CACHE_CONTROL_FOR_ROP_INTERLOCKED_WRITE_REQUESTS,
+                     POLICY_EVICT_NORMAL);
+
+   P_IMMD(p, NV9097, SET_BLEND_PER_FORMAT_ENABLE, SNORM8_UNORM16_SNORM16_TRUE);
+
+   P_IMMD(p, NV9097, SET_ATTRIBUTE_DEFAULT, {
+      .color_front_diffuse    = COLOR_FRONT_DIFFUSE_VECTOR_0001,
+      .color_front_specular   = COLOR_FRONT_SPECULAR_VECTOR_0001,
+      .generic_vector         = GENERIC_VECTOR_VECTOR_0001,
+      .fixed_fnc_texture      = FIXED_FNC_TEXTURE_VECTOR_0001,
+      .dx9_color0             = DX9_COLOR0_VECTOR_0001,
+      .dx9_color1_to_color15  = DX9_COLOR1_TO_COLOR15_VECTOR_0000,
+   });
+
+   P_IMMD(p, NV9097, SET_DA_OUTPUT, VERTEX_ID_USES_ARRAY_START_TRUE);
+
+   P_IMMD(p, NV9097, SET_RENDER_ENABLE_CONTROL,
+                     CONDITIONAL_LOAD_CONSTANT_BUFFER_FALSE);
+
+   P_IMMD(p, NV9097, SET_PS_OUTPUT_SAMPLE_MASK_USAGE, {
+      .enable                       = ENABLE_TRUE,
+      .qualify_by_anti_alias_enable = QUALIFY_BY_ANTI_ALIAS_ENABLE_ENABLE,
+   });
+
+   if (nvk_cmd_buffer_3d_cls(cmd) < VOLTA_A)
+      P_IMMD(p, NV9097, SET_PRIM_CIRCULAR_BUFFER_THROTTLE, 0x3fffff);
+
+   P_IMMD(p, NV9097, SET_BLEND_OPT_CONTROL, ALLOW_FLOAT_PIXEL_KILLS_TRUE);
+   P_IMMD(p, NV9097, SET_BLEND_FLOAT_OPTION, ZERO_TIMES_ANYTHING_IS_ZERO_TRUE);
+
+   if (nvk_cmd_buffer_3d_cls(cmd) < VOLTA_A)
+      P_IMMD(p, NV9097, SET_MAX_TI_WARPS_PER_BATCH, 3);
+
+   if (nvk_cmd_buffer_3d_cls(cmd) >= KEPLER_A &&
+       nvk_cmd_buffer_3d_cls(cmd) < VOLTA_A) {
+      P_IMMD(p, NVA097, SET_TEXTURE_INSTRUCTION_OPERAND,
+                        ORDERING_KEPLER_ORDER);
+   }
+}
 
 void
 nvk_cmd_buffer_begin_graphics(struct nvk_cmd_buffer *cmd,
                               const VkCommandBufferBeginInfo *pBeginInfo)
 {
+   struct nouveau_ws_push *p = cmd->push;
+
+   P_MTHD(p, NV9097, SET_OBJECT);
+   P_NV9097_SET_OBJECT(p, {
+      .class_id = nvk_cmd_buffer_3d_cls(cmd),
+      .engine_id = 0,
+   });
+
+   P_IMMD(p, NV9097, SET_RENDER_ENABLE_C, MODE_TRUE);
+
+   P_IMMD(p, NV9097, SET_Z_COMPRESSION, ENABLE_TRUE);
+   P_MTHD(p, NV9097, SET_COLOR_COMPRESSION(0));
+   for (unsigned i = 0; i < 8; i++)
+      P_NV9097_SET_COLOR_COMPRESSION(p, i, ENABLE_TRUE);
+
+   P_IMMD(p, NV9097, SET_CT_SELECT, { .target_count = 1 });
+
+//   P_MTHD(cmd->push, NVC0_3D, CSAA_ENABLE);
+//   P_INLINE_DATA(cmd->push, 0);
+
+   P_IMMD(p, NV9097, SET_ANTI_ALIAS_ENABLE, V_FALSE);
+   P_IMMD(p, NV9097, SET_ANTI_ALIAS, SAMPLES_MODE_1X1);
+   P_IMMD(p, NV9097, SET_ANTI_ALIAS_ALPHA_CONTROL, {
+      .alpha_to_coverage   = ALPHA_TO_COVERAGE_DISABLE,
+      .alpha_to_one        = ALPHA_TO_ONE_DISABLE,
+   });
+   P_IMMD(p, NV9097, SET_ALIASED_LINE_WIDTH_ENABLE, V_TRUE);
+
+   P_IMMD(p, NV9097, SET_DA_PRIMITIVE_RESTART_VERTEX_ARRAY, ENABLE_TRUE);
+
+   P_IMMD(p, NV9097, SET_BLEND_SEPARATE_FOR_ALPHA, ENABLE_TRUE);
+   P_IMMD(p, NV9097, SET_SINGLE_ROP_CONTROL, ENABLE_FALSE);
+
+   P_IMMD(p, NV9097, SET_SHADE_MODE, V_OGL_SMOOTH);
+
+   P_IMMD(p, NV9097, SET_API_VISIBLE_CALL_LIMIT, V__128);
+
+   P_IMMD(p, NV9097, SET_ZCULL_STATS, ENABLE_TRUE);
+
+   P_IMMD(p, NV9097, SET_L1_CONFIGURATION,
+                     DIRECTLY_ADDRESSABLE_MEMORY_SIZE_48KB);
+
+   magic_3d_init(cmd);
+
+   /* TODO: Vertex runout */
+   /* TODO: temp */
+
+   P_IMMD(p, NV9097, SET_SHADER_LOCAL_MEMORY_WINDOW, 0xff000000); /* TODO */
+
+   /* TODO: TIC */
+   /* TODO: TSC */
+
+   P_IMMD(p, NV9097, SET_WINDOW_ORIGIN, {
+      .mode    = MODE_UPPER_LEFT,
+      .flip_y  = FLIP_Y_FALSE,
+   });
+
+   P_MTHD(p, NV9097, SET_WINDOW_OFFSET_X);
+   P_NV9097_SET_WINDOW_OFFSET_X(p, 0);
+   P_NV9097_SET_WINDOW_OFFSET_Y(p, 0);
+
+   P_IMMD(p, NV9097, SET_ACTIVE_ZCULL_REGION, 0x3f);
+   P_IMMD(p, NV9097, SET_WINDOW_CLIP_ENABLE, V_FALSE);
+   P_IMMD(p, NV9097, SET_CLIP_ID_TEST, ENABLE_FALSE);
+
+   P_IMMD(p, NV9097, X_X_X_SET_CLEAR_CONTROL, {
+      .respect_stencil_mask   = RESPECT_STENCIL_MASK_FALSE,
+      .use_clear_rect         = USE_CLEAR_RECT_FALSE,
+   });
+
+   P_IMMD(p, NV9097, SET_VIEWPORT_SCALE_OFFSET, ENABLE_TRUE);
+
+   P_IMMD(p, NV9097, SET_VIEWPORT_CLIP_CONTROL, {
+      .min_z_zero_max_z_one      = MIN_Z_ZERO_MAX_Z_ONE_TRUE,
+      .pixel_min_z               = PIXEL_MIN_Z_CLAMP,
+      .pixel_max_z               = PIXEL_MAX_Z_CLIP,
+      .geometry_guardband        = GEOMETRY_GUARDBAND_SCALE_256,
+      .line_point_cull_guardband = LINE_POINT_CULL_GUARDBAND_SCALE_256,
+      .geometry_clip             = GEOMETRY_CLIP_WZERO_CLIP,
+      .geometry_guardband_z      = GEOMETRY_GUARDBAND_Z_SAME_AS_XY_GUARDBAND,
+   });
+
+   for (unsigned i = 0; i < 16; i++)
+      P_IMMD(p, NV9097, SET_SCISSOR_ENABLE(i), V_FALSE);
+
+   /* TODO: Macros */
+
+   P_IMMD(p, NV9097, SET_RASTER_ENABLE, V_TRUE);
+   P_IMMD(p, NV9097, SET_CT_MRT_ENABLE, V_TRUE);
+   P_IMMD(p, NV9097, SET_PIPELINE_SHADER(3), {
+      .enable  = ENABLE_FALSE,
+      .type    = TYPE_TESSELLATION,
+   });
+   P_IMMD(p, NV9097, SET_PIPELINE_SHADER(4), {
+      .enable  = ENABLE_FALSE,
+      .type    = TYPE_GEOMETRY,
+   });
+   P_IMMD(p, NV9097, SET_PIPELINE_SHADER(5), {
+      .enable  = ENABLE_FALSE,
+      .type    = TYPE_PIXEL,
+   });
+//   P_MTHD(cmd->push, NVC0_3D, MACRO_GP_SELECT);
+//   P_INLINE_DATA(cmd->push, 0x40);
+   P_IMMD(p, NV9097, SET_RT_LAYER, {
+      .v = 0,
+      .control = CONTROL_V_SELECTS_LAYER,
+   });
+//   P_MTHD(cmd->push, NVC0_3D, MACRO_TEP_SELECT;
+//   P_INLINE_DATA(cmd->push, 0x30);
+   P_IMMD(p, NV9097, SET_PATCH, 3);
+   P_IMMD(p, NV9097, SET_PIPELINE_SHADER(2), {
+      .enable  = ENABLE_FALSE,
+      .type    = TYPE_TESSELLATION_INIT,
+   });
+   P_IMMD(p, NV9097, SET_PIPELINE_SHADER(0), {
+      .enable  = ENABLE_FALSE,
+      .type    = TYPE_VERTEX_CULL_BEFORE_FETCH,
+   });
+
+   P_IMMD(p, NV9097, SET_POINT_SPRITE_SELECT, {
+      .rmode      = RMODE_ZERO,
+      .origin     = ORIGIN_BOTTOM,
+      .texture0   = TEXTURE0_PASSTHROUGH,
+      .texture1   = TEXTURE1_PASSTHROUGH,
+      .texture2   = TEXTURE2_PASSTHROUGH,
+      .texture3   = TEXTURE3_PASSTHROUGH,
+      .texture4   = TEXTURE4_PASSTHROUGH,
+      .texture5   = TEXTURE5_PASSTHROUGH,
+      .texture6   = TEXTURE6_PASSTHROUGH,
+      .texture7   = TEXTURE7_PASSTHROUGH,
+      .texture8   = TEXTURE8_PASSTHROUGH,
+      .texture9   = TEXTURE9_PASSTHROUGH,
+   });
+   P_IMMD(p, NV9097, SET_POINT_CENTER_MODE, V_OGL);
+   P_IMMD(p, NV9097, SET_EDGE_FLAG, V_TRUE);
+   P_IMMD(p, NV9097, SET_SAMPLER_BINDING, V_INDEPENDENTLY);
+   P_IMMD(p, NV9097, INVALIDATE_SAMPLER_CACHE, {
+      .lines = LINES_ALL
+   });
 }
 
 void