# group and sort these by address
# <struct_name> <source_spec> <dirtybit>
# TODO: specify how to combine fields (if not simply |)

# Mark large, dynamically sized state areas such as shader code
# and parameters with DYNAMIC.

base_setup_state base_setup. ETNA_STATE_BASE_SETUP
    PA.W_CLIP_LIMIT
    GL.VERTEX_ELEMENT_CONFIG
    GL.API_MODE
    RA.EARLY_DEPTH

rasterizer_state rasterizer-> ETNA_STATE_RASTERIZER
    PA.CONFIG
    PA.LINE_WIDTH
    PA.POINT_SIZE
    PA.SYSTEM_MODE
    SE.DEPTH_SCALE
    SE.DEPTH_BIAS
    SE.CONFIG
    SE.SCISSOR_LEFT
    SE.SCISSOR_TOP
    SE.SCISSOR_RIGHT
    SE.SCISSOR_BOTTOM
    VS.OUTPUT_COUNT      # Added to shader state output count

depth_stencil_alpha_state depth_stencil_alpha-> ETNA_STATE_DSA
    PE.DEPTH_CONFIG
    PE.ALPHA_OP
    PE.STENCIL_OP
    PE.STENCIL_CONFIG

blend_state blend-> ETNA_STATE_BLEND
    PE.ALPHA_CONFIG
    PE.COLOR_FORMAT
    PE.LOGIC_OP
    PE.DITHER

blend_color blend_color. ETNA_STATE_BLEND_COLOR
    PE.ALPHA_BLEND_COLOR

stencil_ref stencil_ref. ETNA_STATE_STENCIL_REF
    PE.STENCIL_CONFIG
    PE.STENCIL_CONFIG_EXT

scissor_state scissor. ETNA_STATE_SCISSOR
    SE.SCISSOR_LEFT
    SE.SCISSOR_TOP
    SE.SCISSOR_RIGHT
    SE.SCISSOR_BOTTOM

viewport_state viewport. ETNA_STATE_VIEWPORT
    PA.VIEWPORT_SCALE_X
    PA.VIEWPORT_SCALE_Y
    PA.VIEWPORT_SCALE_Z
    PA.VIEWPORT_OFFSET_X
    PA.VIEWPORT_OFFSET_Y
    PA.VIEWPORT_OFFSET_Z
    SE.SCISSOR_LEFT
    SE.SCISSOR_TOP
    SE.SCISSOR_RIGHT
    SE.SCISSOR_BOTTOM
    PE.DEPTH_NEAR
    PE.DEPTH_FAR

sample_mask sample_mask. ETNA_STATE_SAMPLE_MASK
    GL.MULTI_SAMPLE_CONFIG

sampler_state sampler[{0}]-> ETNA_STATE_SAMPLERS
    TE.SAMPLER.CONFIG0        # Set to 0 for inactive samplers
    TE.SAMPLER.CONFIG1        # Only set for active samplers
    TE.SAMPLER.LOD_CONFIG     # Only set for active samplers

sampler_view sampler_view[{0}]. ETNA_STATE_SAMPLER_VIEWS
    TE.SAMPLER.CONFIG0        # Only set for active samplers
    TE.SAMPLER.CONFIG1        # Only set for active samplers
    TE.SAMPLER.LOD_CONFIG     # Only set for active samplers
    TE.SAMPLER.SIZE           # Only set for active samplers
    TE.SAMPLER.LOG_SIZE       # Only set for active samplers
    TE.SAMPLER.LOD_ADDR       # Only set for active samplers

framebuffer_state framebuffer. ETNA_STATE_FRAMEBUFFER
    GL.MULTI_SAMPLE_CONFIG
    PE.COLOR_FORMAT
    PE.DEPTH_CONFIG
    PE.DEPTH_ADDR
    PE.DEPTH_STRIDE
    PE.HDEPTH_CONTROL
    PE.DEPTH_NORMALIZE
    PE.COLOR_ADDR
    PE.PIPE.COLOR_ADDR
    PE.PIPE.DEPTH_ADDR
    PE.COLOR_STRIDE
    SE.SCISSOR_LEFT
    SE.SCISSOR_TOP
    SE.SCISSOR_RIGHT
    SE.SCISSOR_BOTTOM
    RA.MULTISAMPLE_UNK00E04
    RA.MULTISAMPLE_UNK00E10
    RA.CENTROID_TABLE
    TS.MEM_CONFIG
    TS.DEPTH_CLEAR_VALUE
    TS.DEPTH_STATUS_BASE
    TS.DEPTH_SURFACE_BASE
    TS.COLOR_CLEAR_VALUE
    TS.COLOR_STATUS_BASE
    TS.COLOR_SURFACE_BASE

vertex_elements_state vertex_elements-> ETNA_STATE_VERTEX_ELEMENTS
    FE.VERTEX_ELEMENT_CONFIG

set_vertex_buffer vertex_buffer. ETNA_STATE_VERTEX_BUFFERS
    FE.VERTEX_STREAM_CONTROL
    FE.VERTEX_STREAM_BASE_ADDR
    FE.VERTEX_STREAMS.CONTROL
    FE.VERTEX_STREAMS.BASE_ADDR

set_index_buffer index_buffer. ETNA_STATE_INDEX_BUFFER
    FE.INDEX_STREAM_CONTROL
    FE.INDEX_STREAM_BASE_ADDR

shader_state shader_state. ETNA_STATE_SHADER
    RA.CONTROL
    PA.ATTRIBUTE_ELEMENT_COUNT
    PA.CONFIG
    PA.SHADER_ATTRIBUTES
    VS.END_PC
    VS.OUTPUT_COUNT
    VS.INPUT_COUNT
    VS.TEMP_REGISTER_CONTROL
    VS.OUTPUT
    VS.INPUT
    VS.LOAD_BALANCING
    VS.START_PC
    VS.RANGE
    PS.END_PC
    PS.OUTPUT_REG
    PS.INPUT_COUNT
    PS.TEMP_REGISTER_CONTROL
    PS.CONTROL
    PS.START_PC
    PS.RANGE
    GL.VARYING_TOTAL_COMPONENTS
    GL.VARYING_NUM_COMPONENTS
    GL.VARYING_COMPONENT_USE
    VS.INST_MEM                 DYNAMIC
    PS.INST_MEM                 DYNAMIC

shader_state shader_state-> ETNA_STATE_VS_UNIFORMS
    VS.UNIFORMS                 DYNAMIC

shader_state shader_state-> ETNA_STATE_PS_UNIFORMS
    PS.UNIFORMS                 DYNAMIC

