nv2a: Implement NV097_LAUNCH_TRANSFORM_PROGRAM

This commit is contained in:
Erik Abair 2022-06-17 19:25:46 -07:00 committed by Matt Borgerson
parent 8043abc738
commit 9d2d8691b5
6 changed files with 35 additions and 1 deletions

View file

@ -487,6 +487,7 @@ static const VMStateDescription vmstate_nv2a = {
VMSTATE_UINT64(pgraph.dma_vertex_a, NV2AState),
VMSTATE_UINT64(pgraph.dma_vertex_b, NV2AState),
VMSTATE_UINT32(pgraph.primitive_mode, NV2AState),
VMSTATE_UINT32_ARRAY(pgraph.vertex_state_shader_v0, NV2AState, 4),
VMSTATE_UINT32_2DARRAY(pgraph.program_data, NV2AState, NV2A_MAX_TRANSFORM_PROGRAM_LENGTH, VSH_TOKEN_SIZE),
VMSTATE_UINT32_2DARRAY(pgraph.vsh_constants, NV2AState, NV2A_VERTEXSHADER_CONSTANTS, 4),
VMSTATE_BOOL_ARRAY(pgraph.vsh_constants_dirty, NV2AState, NV2A_VERTEXSHADER_CONSTANTS),

View file

@ -331,6 +331,7 @@ typedef struct PGRAPHState {
bool enable_vertex_program_write;
uint32_t vertex_state_shader_v0[4];
uint32_t program_data[NV2A_MAX_TRANSFORM_PROGRAM_LENGTH][VSH_TOKEN_SIZE];
bool program_data_dirty;

View file

@ -1241,6 +1241,8 @@
# define NV097_SET_SHADER_STAGE_PROGRAM 0x00001E70
# define NV097_SET_DOT_RGBMAPPING 0X00001E74
# define NV097_SET_SHADER_OTHER_STAGE_INPUT 0x00001E78
# define NV097_SET_TRANSFORM_DATA 0x00001E80
# define NV097_LAUNCH_TRANSFORM_PROGRAM 0x00001E90
# define NV097_SET_TRANSFORM_EXECUTION_MODE 0x00001E94
# define NV097_SET_TRANSFORM_EXECUTION_MODE_MODE 0x00000003
# define NV097_SET_TRANSFORM_EXECUTION_MODE_RANGE_MODE 0xFFFFFFFC

View file

@ -21,6 +21,7 @@
#include "nv2a_int.h"
#include "nv2a_vsh_emulator.h"
#include "s3tc.h"
#include "ui/xemu-settings.h"
#include "qemu/fast-hash.h"
@ -3689,6 +3690,33 @@ DEF_METHOD(NV097, SET_SHADER_OTHER_STAGE_INPUT)
GET_MASK(parameter, 0xFFFF000));
}
DEF_METHOD_INC(NV097, SET_TRANSFORM_DATA)
{
int slot = (method - NV097_SET_TRANSFORM_DATA) / 4;
pg->vertex_state_shader_v0[slot] = parameter;
}
DEF_METHOD(NV097, LAUNCH_TRANSFORM_PROGRAM)
{
unsigned int program_start = parameter;
assert(program_start < NV2A_MAX_TRANSFORM_PROGRAM_LENGTH);
Nv2aVshProgram program;
Nv2aVshParseResult result = nv2a_vsh_parse_program(
&program,
pg->program_data[program_start],
NV2A_MAX_TRANSFORM_PROGRAM_LENGTH - program_start);
assert(result == NV2AVPR_SUCCESS);
Nv2aVshCPUXVSSExecutionState state_linkage;
Nv2aVshExecutionState state = nv2a_vsh_emu_initialize_xss_execution_state(
&state_linkage, (float*)pg->vsh_constants);
memcpy(state_linkage.input_regs, pg->vertex_state_shader_v0, sizeof(pg->vertex_state_shader_v0));
nv2a_vsh_emu_execute_track_context_writes(&state, &program, pg->vsh_constants_dirty);
nv2a_vsh_program_destroy(&program);
}
DEF_METHOD(NV097, SET_TRANSFORM_EXECUTION_MODE)
{
SET_MASK(pg->regs[NV_PGRAPH_CSV0_D], NV_PGRAPH_CSV0_D_MODE,

View file

@ -182,6 +182,8 @@ DEF_METHOD(NV097, SET_SHADOW_DEPTH_FUNC)
DEF_METHOD(NV097, SET_SHADER_STAGE_PROGRAM)
DEF_METHOD(NV097, SET_DOT_RGBMAPPING)
DEF_METHOD(NV097, SET_SHADER_OTHER_STAGE_INPUT)
DEF_METHOD_RANGE(NV097, SET_TRANSFORM_DATA, 4)
DEF_METHOD(NV097, LAUNCH_TRANSFORM_PROGRAM)
DEF_METHOD(NV097, SET_TRANSFORM_EXECUTION_MODE)
DEF_METHOD(NV097, SET_TRANSFORM_PROGRAM_CXT_WRITE_EN)
DEF_METHOD(NV097, SET_TRANSFORM_PROGRAM_LOAD)

@ -1 +1 @@
Subproject commit 89e6ec852601b77f3c097014af4d29720ab59721
Subproject commit ead0af5dee49e408c005151393f8a7dbcd27026c