X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fnine%2Fnine_pipe.c;h=cc63a9fce8f3c8bfedf64b2d5891d45f10a84559;hb=b408734e5e2fe1e1ef08080c4425ad8a7ed33579;hp=27a10d6447348e15908c3dd68cf51a44220ae9c3;hpb=e85ef7d8e501b3f0a94d8e53fbd3372ba24b89ec;p=mesa.git diff --git a/src/gallium/state_trackers/nine/nine_pipe.c b/src/gallium/state_trackers/nine/nine_pipe.c index 27a10d64473..cc63a9fce8f 100644 --- a/src/gallium/state_trackers/nine/nine_pipe.c +++ b/src/gallium/state_trackers/nine/nine_pipe.c @@ -36,8 +36,11 @@ nine_convert_dsa_state(struct pipe_depth_stencil_alpha_state *dsa_state, if (rs[D3DRS_ZENABLE]) { dsa.depth.enabled = 1; - dsa.depth.writemask = !!rs[D3DRS_ZWRITEENABLE]; dsa.depth.func = d3dcmpfunc_to_pipe_func(rs[D3DRS_ZFUNC]); + /* Disable depth write if no change can occur */ + dsa.depth.writemask = !!rs[D3DRS_ZWRITEENABLE] && + dsa.depth.func != PIPE_FUNC_EQUAL && + dsa.depth.func != PIPE_FUNC_NEVER; } if (rs[D3DRS_STENCILENABLE]) { @@ -70,7 +73,9 @@ nine_convert_dsa_state(struct pipe_depth_stencil_alpha_state *dsa_state, } void -nine_convert_rasterizer_state(struct pipe_rasterizer_state *rast_state, const DWORD *rs) +nine_convert_rasterizer_state(struct NineDevice9 *device, + struct pipe_rasterizer_state *rast_state, + const DWORD *rs) { struct pipe_rasterizer_state rast; @@ -94,7 +99,7 @@ nine_convert_rasterizer_state(struct pipe_rasterizer_state *rast_state, const DW rast.sprite_coord_mode = PIPE_SPRITE_COORD_UPPER_LEFT; rast.point_quad_rasterization = 1; rast.point_size_per_vertex = rs[NINED3DRS_VSPOINTSIZE]; - rast.multisample = !!rs[D3DRS_MULTISAMPLEANTIALIAS]; + rast.multisample = rs[NINED3DRS_MULTISAMPLE]; rast.line_smooth = !!rs[D3DRS_ANTIALIASEDLINEENABLE]; /* rast.line_stipple_enable = 0; */ rast.line_last_pixel = !!rs[D3DRS_LASTPIXEL]; @@ -103,7 +108,8 @@ nine_convert_rasterizer_state(struct pipe_rasterizer_state *rast_state, const DW /* rast.lower_left_origin = 0; */ /* rast.bottom_edge_rule = 0; */ /* rast.rasterizer_discard = 0; */ - rast.depth_clip = 1; + rast.depth_clip_near = 1; + rast.depth_clip_far = 1; rast.clip_halfz = 1; rast.clip_plane_enable = rs[D3DRS_CLIPPLANEENABLE]; /* rast.line_stipple_factor = 0; */ @@ -120,14 +126,12 @@ nine_convert_rasterizer_state(struct pipe_rasterizer_state *rast_state, const DW /* offset_units has the ogl/d3d11 meaning. * d3d9: offset = scale * dz + bias * ogl/d3d11: offset = scale * dz + r * bias - * with r implementation dependant and is supposed to be - * the smallest value the depth buffer format can hold. - * In practice on current and past hw it seems to be 2^-23 - * for all formats except float formats where it varies depending - * on the content. - * For now use 1 << 23, but in the future perhaps add a way in gallium - * to get r for the format or get the gallium behaviour */ - rast.offset_units = asfloat(rs[D3DRS_DEPTHBIAS]) * (float)(1 << 23); + * with r implementation dependent (+ different formula for float depth + * buffers). r=2^-23 is often the right value for gallium drivers. + * If possible, use offset_units_unscaled, which gives the d3d9 + * behaviour, else scale by 1 << 23 */ + rast.offset_units = asfloat(rs[D3DRS_DEPTHBIAS]) * (device->driver_caps.offset_units_unscaled ? 1.0f : (float)(1 << 23)); + rast.offset_units_unscaled = device->driver_caps.offset_units_unscaled; rast.offset_scale = asfloat(rs[D3DRS_SLOPESCALEDEPTHBIAS]); /* rast.offset_clamp = 0.0f; */ @@ -162,7 +166,7 @@ nine_convert_blend_state(struct pipe_blend_state *blend_state, const DWORD *rs) blend.dither = !!rs[D3DRS_DITHERENABLE]; /* blend.alpha_to_one = 0; */ - blend.alpha_to_coverage = !!rs[NINED3DRS_ALPHACOVERAGE]; + blend.alpha_to_coverage = rs[NINED3DRS_ALPHACOVERAGE] & 1; blend.rt[0].blend_enable = !!rs[D3DRS_ALPHABLENDENABLE]; if (blend.rt[0].blend_enable) { @@ -182,6 +186,7 @@ nine_convert_blend_state(struct pipe_blend_state *blend_state, const DWORD *rs) nine_convert_blend_state_fixup(&blend, rs); /* for BOTH[INV]SRCALPHA */ } + blend.max_rt = 3; /* Upper bound. Could be optimized to fb->nr_cbufs for example */ blend.rt[0].colormask = rs[D3DRS_COLORWRITEENABLE]; if (rs[D3DRS_COLORWRITEENABLE1] != rs[D3DRS_COLORWRITEENABLE] || @@ -220,9 +225,17 @@ nine_convert_sampler_state(struct cso_context *ctx, int idx, const DWORD *ss) samp.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; } samp.max_lod = 15.0f; - samp.wrap_s = d3dtextureaddress_to_pipe_tex_wrap(ss[D3DSAMP_ADDRESSU]); - samp.wrap_t = d3dtextureaddress_to_pipe_tex_wrap(ss[D3DSAMP_ADDRESSV]); - samp.wrap_r = d3dtextureaddress_to_pipe_tex_wrap(ss[D3DSAMP_ADDRESSW]); + + if (ss[NINED3DSAMP_CUBETEX]) { + /* Cube textures are always clamped to edge on D3D */ + samp.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; + samp.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE; + samp.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; + } else { + samp.wrap_s = d3dtextureaddress_to_pipe_tex_wrap(ss[D3DSAMP_ADDRESSU]); + samp.wrap_t = d3dtextureaddress_to_pipe_tex_wrap(ss[D3DSAMP_ADDRESSV]); + samp.wrap_r = d3dtextureaddress_to_pipe_tex_wrap(ss[D3DSAMP_ADDRESSW]); + } samp.min_img_filter = (ss[D3DSAMP_MINFILTER] == D3DTEXF_POINT && !ss[NINED3DSAMP_SHADOW]) ? PIPE_TEX_FILTER_NEAREST : PIPE_TEX_FILTER_LINEAR; samp.mag_img_filter = (ss[D3DSAMP_MAGFILTER] == D3DTEXF_POINT && !ss[NINED3DSAMP_SHADOW]) ? PIPE_TEX_FILTER_NEAREST : PIPE_TEX_FILTER_LINEAR; if (ss[D3DSAMP_MINFILTER] == D3DTEXF_ANISOTROPIC || @@ -231,7 +244,7 @@ nine_convert_sampler_state(struct cso_context *ctx, int idx, const DWORD *ss) samp.compare_mode = ss[NINED3DSAMP_SHADOW] ? PIPE_TEX_COMPARE_R_TO_TEXTURE : PIPE_TEX_COMPARE_NONE; samp.compare_func = PIPE_FUNC_LEQUAL; samp.normalized_coords = 1; - samp.seamless_cube_map = 1; + samp.seamless_cube_map = 0; d3dcolor_to_pipe_color_union(&samp.border_color, ss[D3DSAMP_BORDERCOLOR]); /* see nine_state.h */ @@ -241,28 +254,6 @@ nine_convert_sampler_state(struct cso_context *ctx, int idx, const DWORD *ss) cso_single_sampler(ctx, PIPE_SHADER_VERTEX, idx - NINE_SAMPLER_VS(0), &samp); } -void -nine_pipe_context_clear(struct NineDevice9 *This) -{ - struct pipe_context *pipe = This->pipe; - struct cso_context *cso = This->cso; - pipe->bind_vs_state(pipe, NULL); - pipe->bind_fs_state(pipe, NULL); - - /* Don't unbind constant buffers, they're device-private and - * do not change on Reset. - */ - - cso_set_samplers(cso, PIPE_SHADER_VERTEX, 0, NULL); - cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 0, NULL); - - cso_set_sampler_views(cso, PIPE_SHADER_VERTEX, 0, NULL); - cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 0, NULL); - - pipe->set_vertex_buffers(pipe, 0, This->caps.MaxStreams, NULL); - pipe->set_index_buffer(pipe, NULL); -} - const enum pipe_format nine_d3d9_to_pipe_format_map[120] = { [D3DFMT_UNKNOWN] = PIPE_FORMAT_NONE, @@ -289,17 +280,17 @@ const enum pipe_format nine_d3d9_to_pipe_format_map[120] = [D3DFMT_A8L8] = PIPE_FORMAT_L8A8_UNORM, [D3DFMT_A4L4] = PIPE_FORMAT_L4A4_UNORM, [D3DFMT_V8U8] = PIPE_FORMAT_R8G8_SNORM, - [D3DFMT_L6V5U5] = PIPE_FORMAT_NONE, - [D3DFMT_X8L8V8U8] = PIPE_FORMAT_NONE, + [D3DFMT_L6V5U5] = PIPE_FORMAT_NONE, /* Should be PIPE_FORMAT_R5SG5SB6U_NORM, but interpretation of the data differs a bit. */ + [D3DFMT_X8L8V8U8] = PIPE_FORMAT_R8SG8SB8UX8U_NORM, [D3DFMT_Q8W8V8U8] = PIPE_FORMAT_R8G8B8A8_SNORM, [D3DFMT_V16U16] = PIPE_FORMAT_R16G16_SNORM, [D3DFMT_A2W10V10U10] = PIPE_FORMAT_R10SG10SB10SA2U_NORM, [D3DFMT_D16_LOCKABLE] = PIPE_FORMAT_Z16_UNORM, [D3DFMT_D32] = PIPE_FORMAT_Z32_UNORM, - [D3DFMT_D15S1] = PIPE_FORMAT_Z24_UNORM_S8_UINT, + [D3DFMT_D15S1] = PIPE_FORMAT_NONE, [D3DFMT_D24S8] = PIPE_FORMAT_S8_UINT_Z24_UNORM, [D3DFMT_D24X8] = PIPE_FORMAT_X8Z24_UNORM, - [D3DFMT_D24X4S4] = PIPE_FORMAT_Z24_UNORM_S8_UINT, + [D3DFMT_D24X4S4] = PIPE_FORMAT_NONE, [D3DFMT_D16] = PIPE_FORMAT_Z16_UNORM, [D3DFMT_D32F_LOCKABLE] = PIPE_FORMAT_Z32_FLOAT, [D3DFMT_D24FS8] = PIPE_FORMAT_Z32_FLOAT_S8X24_UINT,