diff options
Diffstat (limited to 'src/mame/includes/xbox_nv2a.h')
-rw-r--r-- | src/mame/includes/xbox_nv2a.h | 410 |
1 files changed, 246 insertions, 164 deletions
diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h index 90c8fff55e7..a64863e603c 100644 --- a/src/mame/includes/xbox_nv2a.h +++ b/src/mame/includes/xbox_nv2a.h @@ -11,8 +11,6 @@ #include "machine/pic8259.h" #include "video/poly.h" -#include <mutex> - class vertex_program_disassembler { static char const *const srctypes[]; static char const *const scaops[]; @@ -126,7 +124,7 @@ public: } c_constant[192]; union temp { float fv[4]; - } r_temp[32]; + } r_register[32]; // output vertex vertex_nv *output; // instructions @@ -134,9 +132,9 @@ public: unsigned int i[4]; int modified; struct decoded { - int SwizzleA[4], SignA, ParameterTypeA, TempIndexA; - int SwizzleB[4], SignB, ParameterTypeB, TempIndexB; - int SwizzleC[4], SignC, ParameterTypeC, TempIndexC; + int SwizzleA[4], NegateA, ParameterTypeA, TempIndexA; + int SwizzleB[4], NegateB, ParameterTypeB, TempIndexB; + int SwizzleC[4], NegateC, ParameterTypeC, TempIndexC; VectorialOperation VecOperation; ScalarOperation ScaOperation; int OutputWriteMask, MultiplexerControl; @@ -165,11 +163,165 @@ private: void generate_input(float t[4], int sign, int type, int temp, int swizzle[4]); void compute_vectorial_operation(float t[4], int instruction, float par[3 * 4]); void compute_scalar_operation(float t[4], int instruction, float par[3 * 4]); + void assign_output(int index, float t[4], int mask); + void assign_register(int index, float t[4], int mask); + void assign_constant(int index, float t[4], int mask); int ip; int a0x; }; +struct Combiner { + enum class InputRegister { + Zero = 0, + Color0, + Color1, + FogColor, + PrimaryColor, + SecondaryColor, + Texture0Color = 8, + Texture1Color, + Texture2Color, + Texture3Color, + Spare0, + Spare1, + SumClamp, + EF + }; + enum class MapFunction { + UnsignedIdentity = 0, + UnsignedInvert, + ExpandNormal, + ExpandNegate, + HalfBiasNormal, + HalfBiasNegate, + SignedIdentyty, + SignedNegate + }; + struct { + struct { + float A[4]; // 0=R 1=G 2=B 3=A + float B[4]; + float C[4]; + float D[4]; + float E[4]; + float F[4]; + float G; + float EF[4]; + float sumclamp[4]; + } variables; + struct { + float RGBop1[4]; // 0=R 1=G 2=B + float RGBop2[4]; + float RGBop3[4]; + float Aop1; + float Aop2; + float Aop3; + } functions; + struct { + float primarycolor[4]; // rw + float secondarycolor[4]; + float texture0color[4]; + float texture1color[4]; + float texture2color[4]; + float texture3color[4]; + float color0[4]; + float color1[4]; + float spare0[4]; + float spare1[4]; + float fogcolor[4]; // ro + float zero[4]; + } registers; + float output[4]; + } work[WORK_MAX_THREADS]; + struct { + struct { + float constantcolor0[4]; + float constantcolor1[4]; + struct { + InputRegister A_input; + int A_component; + MapFunction A_mapping; + InputRegister B_input; + int B_component; + MapFunction B_mapping; + InputRegister C_input; + int C_component; + MapFunction C_mapping; + InputRegister D_input; + int D_component; + MapFunction D_mapping; + } mapin_alpha; + struct { + InputRegister A_input; + int A_component; + MapFunction A_mapping; + InputRegister B_input; + int B_component; + MapFunction B_mapping; + InputRegister C_input; + int C_component; + MapFunction C_mapping; + InputRegister D_input; + int D_component; + MapFunction D_mapping; + } mapin_rgb; + struct { + InputRegister CD_output; + InputRegister AB_output; + InputRegister SUM_output; + int CD_dotproduct; + int AB_dotproduct; + int muxsum; + int bias; + int scale; + } mapout_alpha; + struct { + InputRegister CD_output; + InputRegister AB_output; + InputRegister SUM_output; + int CD_dotproduct; + int AB_dotproduct; + int muxsum; + int bias; + int scale; + } mapout_rgb; + } stage[8]; + struct { + float constantcolor0[4]; + float constantcolor1[4]; + int color_sum_clamp; + struct { + InputRegister G_input; + int G_component; + MapFunction G_mapping; + } mapin_alpha; + struct { + InputRegister A_input; + int A_component; + MapFunction A_mapping; + InputRegister B_input; + int B_component; + MapFunction B_mapping; + InputRegister C_input; + int C_component; + MapFunction C_mapping; + InputRegister D_input; + int D_component; + MapFunction D_mapping; + InputRegister E_input; + int E_component; + MapFunction E_mapping; + InputRegister F_input; + int F_component; + MapFunction F_mapping; + } mapin_rgb; + } final; + int stages; + } setup; + int used; +}; + class nv2a_renderer; // forward declaration struct nvidia_object_data { @@ -196,10 +348,10 @@ objects have methods used to do drawing most methods set parameters, others actually draw */ -class nv2a_rasterizer : public poly_manager<double, nvidia_object_data, 13, 8192> +class nv2a_rasterizer : public poly_manager<double, nvidia_object_data, 26, 8192> { public: - nv2a_rasterizer(running_machine& machine) : poly_manager<double, nvidia_object_data, 13, 8192>(machine) + nv2a_rasterizer(running_machine &machine) : poly_manager<double, nvidia_object_data, 26, 8192>(machine) { } }; @@ -209,18 +361,32 @@ class nv2a_renderer public: enum class VERTEX_PARAMETER { PARAM_COLOR_B = 0, - PARAM_COLOR_G = 1, - PARAM_COLOR_R = 2, - PARAM_COLOR_A = 3, - PARAM_TEXTURE0_U = 4, - PARAM_TEXTURE0_V = 5, - PARAM_TEXTURE1_U = 6, - PARAM_TEXTURE1_V = 7, - PARAM_TEXTURE2_U = 8, - PARAM_TEXTURE2_V = 9, - PARAM_TEXTURE3_U = 10, - PARAM_TEXTURE3_V = 11, - PARAM_Z = 12 + PARAM_COLOR_G, + PARAM_COLOR_R, + PARAM_COLOR_A, + PARAM_TEXTURE0_S, + PARAM_TEXTURE0_T, + PARAM_TEXTURE0_R, + PARAM_TEXTURE0_Q, + PARAM_TEXTURE1_S, + PARAM_TEXTURE1_T, + PARAM_TEXTURE1_R, + PARAM_TEXTURE1_Q, + PARAM_TEXTURE2_S, + PARAM_TEXTURE2_T, + PARAM_TEXTURE2_R, + PARAM_TEXTURE2_Q, + PARAM_TEXTURE3_S, + PARAM_TEXTURE3_T, + PARAM_TEXTURE3_R, + PARAM_TEXTURE3_Q, + PARAM_SECONDARY_COLOR_B, + PARAM_SECONDARY_COLOR_G, + PARAM_SECONDARY_COLOR_R, + PARAM_SECONDARY_COLOR_A, + PARAM_Z, + PARAM_1W, + ALL }; enum class NV2A_BEGIN_END { STOP = 0, @@ -413,6 +579,7 @@ public: objectdata->data = this; combiner.used = 0; primitives_total_count = 0; + primitives_batches_count = 0; indexesleft_count = 0; triangles_bfculled = 0; vertex_pipeline = 4; @@ -440,6 +607,14 @@ public: blend_function_source = NV2A_BLEND_FACTOR::ONE; logical_operation_enabled = false; logical_operation = NV2A_LOGIC_OP::COPY; + fog_color = 0; + for (int n = 0; n < 4; n++) { + texture[n].enabled = 0; + texture[n].mode = 0; + texture[n].addrmodes = 1; + texture[n].addrmodet = 1; + texture[n].addrmoder = 1; + } for (int n = 0; n < 8; n++) clippingwindows[n].set(0, 0, 640, 480); limits_rendertarget.set(0, 0, 640, 480); @@ -463,6 +638,7 @@ public: rendertarget = nullptr; depthbuffer = nullptr; displayedtarget = nullptr; + old_rendertarget = nullptr; puller_waiting = 0; debug_grab_texttype = -1; debug_grab_textfile = nullptr; @@ -497,29 +673,29 @@ public: void surface_2d_blit(); uint32_t texture_get_texel(int number, int x, int y); uint8_t *read_pixel(int x, int y, int32_t c[4]); - void write_pixel(int x, int y, uint32_t color, int depth); - void combiner_initialize_registers(uint32_t argb8[6]); - void combiner_initialize_stage(int stage_number); - void combiner_initialize_final(); - void combiner_map_input(int stage_number); // map combiner registers to variables A..D - void combiner_map_output(int stage_number); // map combiner calculation results to combiner registers - void combiner_map_final_input(); // map final combiner registers to variables A..F - void combiner_final_output(); // generate final combiner output - float combiner_map_input_select(int code, int index); // get component index in register code - float *combiner_map_input_select3(int code); // get pointer to register code - float *combiner_map_output_select3(int code); // get pointer to register code for output - float combiner_map_input_function(int code, float value); // apply input mapping function code to value - void combiner_map_input_function3(int code, float *data); // apply input mapping function code to data - void combiner_function_AB(float result[4]); - void combiner_function_AdotB(float result[4]); - void combiner_function_CD(float result[4]); - void combiner_function_CdotD(float result[4]); - void combiner_function_ABmuxCD(float result[4]); - void combiner_function_ABsumCD(float result[4]); - void combiner_compute_rgb_outputs(int index); - void combiner_compute_a_outputs(int index); - void combiner_argb8_float(uint32_t color, float reg[4]); - uint32_t combiner_float_argb8(float reg[4]); + void write_pixel(int x, int y, uint32_t color, int z); + void combiner_initialize_registers(int id, float rgba[6][4]); + void combiner_initialize_stage(int id, int stage_number); + void combiner_initialize_final(int id); + void combiner_map_stage_input(int id, int stage_number); // map combiner registers to variables A..D + void combiner_map_stage_output(int id, int stage_number); // map combiner calculation results to combiner registers + void combiner_map_final_input(int id); // map final combiner registers to variables A..F + void combiner_final_output(int id); // generate final combiner output + float combiner_map_input_select(int id, Combiner::InputRegister code, int index); // get component index in register selected as input + float *combiner_map_input_select_array(int id, Combiner::InputRegister code); // get pointer to register selected as input + float *combiner_map_output_select_array(int id, Combiner::InputRegister code); // get pointer to register selected as output + float combiner_map_input_function(Combiner::MapFunction code, float value); // apply input mapping function code to value + void combiner_map_input_function_array(Combiner::MapFunction code, float *data); // apply input mapping function code to data + void combiner_function_AB(int id, float result[4]); // calculate values for possible outputs + void combiner_function_AdotB(int id, float result[4]); + void combiner_function_CD(int id, float result[4]); + void combiner_function_CdotD(int id, float result[4]); + void combiner_function_ABmuxCD(int id, float result[4]); + void combiner_function_ABsumCD(int id, float result[4]); + void combiner_compute_rgb_outputs(int id, int index); + void combiner_compute_alpha_outputs(int id, int index); + void combiner_argb8_float(uint32_t color, float reg[4]); // convert from color to float array + uint32_t combiner_float_argb8(float reg[4]); // convert from float array to color uint32_t dilate0(uint32_t value, int bits); uint32_t dilate1(uint32_t value, int bits); void computedilated(void); @@ -542,8 +718,8 @@ public: void convert_vertices(vertex_nv *source, nv2avertex_t *destination, int count); void assemble_primitive(vertex_nv *source, int count); int clip_triangle_w(nv2avertex_t *vi[3], nv2avertex_t *vo); - uint32_t render_triangle_clipping(const rectangle &cliprect, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); - uint32_t render_triangle_culling(const rectangle &cliprect, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); + uint32_t render_triangle_clipping(const rectangle &cliprect, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); + uint32_t render_triangle_culling(const rectangle &cliprect, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3); void clear_render_target(int what, uint32_t value); void clear_depth_buffer(int what, uint32_t value); inline uint8_t *direct_access_ptr(offs_t address); @@ -590,21 +766,20 @@ public: uint32_t *rendertarget; uint32_t *depthbuffer; uint32_t *displayedtarget; + uint32_t *old_rendertarget; struct { uint32_t address[16]; int type[16]; int stride[16]; - NV2A_VTXBUF_TYPE kind[16]; - int size[16]; int words[16]; - int offset[16]; + int offset[16 + 1]; int enabled; // bitmask } vertexbuffer; struct { int enabled; - int sizeu; - int sizev; - int sizew; + int sizes; + int sizet; + int sizer; int dilate; NV2A_TEX_FORMAT format; bool rectangle; @@ -612,6 +787,7 @@ public: void *buffer; int dma0; int dma1; + int mode; int cubic; int noborder; int dims; @@ -623,11 +799,15 @@ public: int mipmapminlod; int rectheight; int rectwidth; + int addrmodes; + int addrmodet; + int addrmoder; } texture[4]; uint32_t triangles_bfculled; NV2A_BEGIN_END primitive_type; uint32_t primitives_count; uint32_t primitives_total_count; + uint32_t primitives_batches_count; int indexesleft_count; int indexesleft_first; uint32_t vertex_indexes[1024]; // vertex indices sent by the software to the 3d accelerator @@ -638,134 +818,32 @@ public: nv2avertex_t vertex_xy[1024+2]; // vertex attributes computed by the 3d accelerator vertex_nv persistvertexattr; // persistent vertex attributes nv2a_rasterizer::render_delegate render_spans_callback; - - struct { - float variable_A[4]; // 0=R 1=G 2=B 3=A - float variable_B[4]; - float variable_C[4]; - float variable_D[4]; - float variable_E[4]; - float variable_F[4]; - float variable_G; - float variable_EF[4]; - float variable_sumclamp[4]; - float function_RGBop1[4]; // 0=R 1=G 2=B - float function_RGBop2[4]; - float function_RGBop3[4]; - float function_Aop1; - float function_Aop2; - float function_Aop3; - float register_primarycolor[4]; // rw - float register_secondarycolor[4]; - float register_texture0color[4]; - float register_texture1color[4]; - float register_texture2color[4]; - float register_texture3color[4]; - float register_color0[4]; - float register_color1[4]; - float register_spare0[4]; - float register_spare1[4]; - float register_fogcolor[4]; // ro - float register_zero[4]; - float output[4]; - struct { - float register_constantcolor0[4]; - float register_constantcolor1[4]; - int mapin_aA_input; - int mapin_aA_component; - int mapin_aA_mapping; - int mapin_aB_input; - int mapin_aB_component; - int mapin_aB_mapping; - int mapin_aC_input; - int mapin_aC_component; - int mapin_aC_mapping; - int mapin_aD_input; - int mapin_aD_component; - int mapin_aD_mapping; - int mapin_rgbA_input; - int mapin_rgbA_component; - int mapin_rgbA_mapping; - int mapin_rgbB_input; - int mapin_rgbB_component; - int mapin_rgbB_mapping; - int mapin_rgbC_input; - int mapin_rgbC_component; - int mapin_rgbC_mapping; - int mapin_rgbD_input; - int mapin_rgbD_component; - int mapin_rgbD_mapping; - int mapout_aCD_output; - int mapout_aAB_output; - int mapout_aSUM_output; - int mapout_aCD_dotproduct; - int mapout_aAB_dotproduct; - int mapout_a_muxsum; - int mapout_a_bias; - int mapout_a_scale; - int mapout_rgbCD_output; - int mapout_rgbAB_output; - int mapout_rgbSUM_output; - int mapout_rgbCD_dotproduct; - int mapout_rgbAB_dotproduct; - int mapout_rgb_muxsum; - int mapout_rgb_bias; - int mapout_rgb_scale; - } stage[8]; - struct { - float register_constantcolor0[4]; - float register_constantcolor1[4]; - int color_sum_clamp; - int mapin_rgbA_input; - int mapin_rgbA_component; - int mapin_rgbA_mapping; - int mapin_rgbB_input; - int mapin_rgbB_component; - int mapin_rgbB_mapping; - int mapin_rgbC_input; - int mapin_rgbC_component; - int mapin_rgbC_mapping; - int mapin_rgbD_input; - int mapin_rgbD_component; - int mapin_rgbD_mapping; - int mapin_rgbE_input; - int mapin_rgbE_component; - int mapin_rgbE_mapping; - int mapin_rgbF_input; - int mapin_rgbF_component; - int mapin_rgbF_mapping; - int mapin_aG_input; - int mapin_aG_component; - int mapin_aG_mapping; - } final; - int stages; - int used; - std::mutex lock; - } combiner; + Combiner combiner; uint32_t color_mask; bool backface_culling_enabled; NV2A_GL_FRONT_FACE backface_culling_winding; NV2A_GL_CULL_FACE backface_culling_culled; bool alpha_test_enabled; + bool depth_test_enabled; + bool stencil_test_enabled; + bool depth_write_enabled; + bool blending_enabled; + bool logical_operation_enabled; NV2A_COMPARISON_OP alpha_func; int alpha_reference; - bool depth_test_enabled; NV2A_COMPARISON_OP depth_function; - bool depth_write_enabled; - bool stencil_test_enabled; NV2A_COMPARISON_OP stencil_func; int stencil_ref; int stencil_mask; NV2A_STENCIL_OP stencil_op_fail; NV2A_STENCIL_OP stencil_op_zfail; NV2A_STENCIL_OP stencil_op_zpass; - bool blending_enabled; NV2A_BLEND_EQUATION blend_equation; NV2A_BLEND_FACTOR blend_function_source; NV2A_BLEND_FACTOR blend_function_destination; uint32_t blend_color; - bool logical_operation_enabled; NV2A_LOGIC_OP logical_operation; + uint32_t fog_color; struct { float modelview[4][4]; float modelview_inverse[4][4]; @@ -787,13 +865,17 @@ public: struct { int format; - int pitch_source; - int pitch_destination; - uint32_t source_address; - uint32_t destination_address; + uint32_t pitch_source; + uint32_t pitch_destination; + offs_t source_address; + offs_t destination_address; int op; int width; int heigth; + uint32_t sourcex; + uint32_t sourcey; + uint32_t destinationx; + uint32_t destinationy; } bitblit; emu_timer *puller_timer; int puller_waiting; |