nvk: Import 3D context init code from nouveau

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>
This commit is contained in:
Faith Ekstrand 2023-01-30 20:11:52 -06:00 committed by Marge Bot
parent 7315650739
commit 617532b24e

View 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