Merge pull request #950 from raven02/patch-1

RSX : few more refactoring
This commit is contained in:
Raul Tambre 2015-01-03 21:14:56 +02:00
commit 1d914d820b
5 changed files with 290 additions and 273 deletions

View File

@ -1771,6 +1771,130 @@ void GLGSRender::DepthMask(u32 flag)
checkForGlError("glDepthMask"); checkForGlError("glDepthMask");
} }
void GLGSRender::PolygonMode(u32 face, u32 mode)
{
switch (face)
{
case NV4097_SET_FRONT_POLYGON_MODE:
glPolygonMode(GL_FRONT, mode);
break;
case NV4097_SET_BACK_POLYGON_MODE:
glPolygonMode(GL_BACK, mode);
break;
}
checkForGlError("glPolygonMode");
}
void GLGSRender::PointSize(float size)
{
glPointSize(m_point_size);
checkForGlError("glPointSize");
}
void GLGSRender::LogicOp(u32 opcdoe)
{
glLogicOp(opcdoe);
checkForGlError("glLogicOp");
}
void GLGSRender::LineWidth(float width)
{
glLineWidth(width);
checkForGlError("glLineWidth");
}
void GLGSRender::LineStipple(u16 factor, u16 pattern)
{
glLineStipple(factor, pattern);
checkForGlError("glLineStipple");
}
void GLGSRender::PrimitiveRestartIndex(u32 index)
{
glPrimitiveRestartIndex(index);
checkForGlError("glPrimitiveRestartIndex");
}
void GLGSRender::CullFace(u32 mode)
{
glCullFace(mode);
checkForGlError("glCullFace");
}
void GLGSRender::FrontFace(u32 mode)
{
glFrontFace(mode);
checkForGlError("glFrontFace");
}
void GLGSRender::Fogi(u32 mode)
{
glFogi(GL_FOG_MODE, mode);
checkForGlError("glFogi(GL_FOG_MODE)");
}
void GLGSRender::Fogf(float start, float end)
{
glFogf(GL_FOG_START, start);
checkForGlError("glFogf(GL_FOG_START)");
glFogf(GL_FOG_END, end);
checkForGlError("glFogf(GL_FOG_END)");
}
void GLGSRender::PolygonOffset(float factor , float bias)
{
glPolygonOffset(factor, bias);
checkForGlError("glPolygonOffset");
}
void GLGSRender::DepthRangef(float min, float max)
{
glDepthRangef(min, max);
checkForGlError("glDepthRangef");
}
void GLGSRender::BlendEquationSeparate(u16 rgb, u16 a)
{
glBlendEquationSeparate(rgb, a);
checkForGlError("glBlendEquationSeparate");
}
void GLGSRender::BlendFuncSeparate(u16 srcRGB, u16 dstRGB, u16 srcAlpha, u16 dstAlpha)
{
glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
checkForGlError("glBlendFuncSeparate");
}
void GLGSRender::BlendColor(u8 r, u8 g, u8 b, u8 a)
{
glBlendColor(r, g, b, a);
checkForGlError("glBlendColor");
}
void GLGSRender::LightModeli(u32 enable)
{
enable ? glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE) : glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
checkForGlError("glLightModeli");
}
void GLGSRender::ShadeModel(u32 mode)
{
glShadeModel(m_shade_mode);
checkForGlError("glShadeModel");
}
void GLGSRender::DepthBoundsEXT(float min, float max)
{
glDepthBoundsEXT(min, max);
checkForGlError("glDepthBoundsEXT");
}
void GLGSRender::Scissor(u16 x, u16 y, u16 width, u16 height)
{
glScissor(x, y, width, height);
checkForGlError("glScissor");
}
void GLGSRender::ExecCMD() void GLGSRender::ExecCMD()
{ {
if (!LoadProgram()) if (!LoadProgram())
@ -1782,42 +1906,6 @@ void GLGSRender::ExecCMD()
InitDrawBuffers(); InitDrawBuffers();
if (m_set_front_polygon_mode)
{
glPolygonMode(GL_FRONT, m_front_polygon_mode);
checkForGlError("glPolygonMode(Front)");
}
if (m_set_back_polygon_mode)
{
glPolygonMode(GL_BACK, m_back_polygon_mode);
checkForGlError("glPolygonMode(Back)");
}
if (m_set_point_size)
{
glPointSize(m_point_size);
checkForGlError("glPointSize");
}
if (m_set_poly_offset_mode)
{
glPolygonOffset(m_poly_offset_scale_factor, m_poly_offset_bias);
checkForGlError("glPolygonOffset");
}
if (m_set_logic_op)
{
glLogicOp(m_logic_op);
checkForGlError("glLogicOp");
}
if (m_set_scissor_horizontal && m_set_scissor_vertical)
{
glScissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h);
checkForGlError("glScissor");
}
if (m_set_two_sided_stencil_test_enable) if (m_set_two_sided_stencil_test_enable)
{ {
if (m_set_stencil_fail && m_set_stencil_zfail && m_set_stencil_zpass) if (m_set_stencil_fail && m_set_stencil_zfail && m_set_stencil_zpass)
@ -1877,98 +1965,12 @@ void GLGSRender::ExecCMD()
} }
} }
if (m_set_two_side_light_enable)
{
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
checkForGlError("glLightModeli");
}
if (m_set_shade_mode)
{
glShadeModel(m_shade_mode);
checkForGlError("glShadeModel");
}
if (m_set_depth_bounds)
{
glDepthBoundsEXT(m_depth_bounds_min, m_depth_bounds_max);
checkForGlError("glDepthBounds");
}
if (m_set_clip)
{
glDepthRangef(m_clip_min, m_clip_max);
checkForGlError("glDepthRangef");
}
if (m_set_line_width)
{
glLineWidth(m_line_width);
checkForGlError("glLineWidth");
}
if (m_set_line_stipple)
{
glLineStipple(m_line_stipple_factor, m_line_stipple_pattern);
checkForGlError("glLineStipple");
}
if (m_set_polygon_stipple) if (m_set_polygon_stipple)
{ {
glPolygonStipple((const GLubyte*)m_polygon_stipple_pattern); glPolygonStipple((const GLubyte*)m_polygon_stipple_pattern);
checkForGlError("glPolygonStipple"); checkForGlError("glPolygonStipple");
} }
if (m_set_blend_equation)
{
glBlendEquationSeparate(m_blend_equation_rgb, m_blend_equation_alpha);
checkForGlError("glBlendEquationSeparate");
}
if (m_set_blend_sfactor && m_set_blend_dfactor)
{
glBlendFuncSeparate(m_blend_sfactor_rgb, m_blend_dfactor_rgb, m_blend_sfactor_alpha, m_blend_dfactor_alpha);
checkForGlError("glBlendFuncSeparate");
}
if (m_set_blend_color)
{
glBlendColor(m_blend_color_r, m_blend_color_g, m_blend_color_b, m_blend_color_a);
checkForGlError("glBlendColor");
}
if (m_set_cull_face)
{
glCullFace(m_cull_face);
checkForGlError("glCullFace");
}
if (m_set_front_face)
{
glFrontFace(m_front_face);
checkForGlError("glFrontFace");
}
if (m_set_fog_mode)
{
glFogi(GL_FOG_MODE, m_fog_mode);
checkForGlError("glFogi(GL_FOG_MODE)");
}
if (m_set_fog_params)
{
glFogf(GL_FOG_START, m_fog_param0);
checkForGlError("glFogf(GL_FOG_START)");
glFogf(GL_FOG_END, m_fog_param1);
checkForGlError("glFogf(GL_FOG_END)");
}
if (m_set_restart_index)
{
glPrimitiveRestartIndex(m_restart_index);
checkForGlError("glPrimitiveRestartIndex");
}
if (m_indexed_array.m_count && m_draw_array_count) if (m_indexed_array.m_count && m_draw_array_count)
{ {
LOG_WARNING(RSX, "m_indexed_array.m_count && draw_array_count"); LOG_WARNING(RSX, "m_indexed_array.m_count && draw_array_count");

View File

@ -199,5 +199,24 @@ protected:
virtual void AlphaFunc(u32 func, float ref); virtual void AlphaFunc(u32 func, float ref);
virtual void DepthFunc(u32 func); virtual void DepthFunc(u32 func);
virtual void DepthMask(u32 flag); virtual void DepthMask(u32 flag);
virtual void PolygonMode(u32 face, u32 mode);
virtual void PointSize(float size);
virtual void LogicOp(u32 opcdoe);
virtual void LineWidth(float width);
virtual void LineStipple(u16 factor, u16 pattern);
virtual void PrimitiveRestartIndex(u32 index);
virtual void CullFace(u32 mode);
virtual void FrontFace(u32 mode);
virtual void Fogi(u32 mode);
virtual void Fogf(float start, float end);
virtual void PolygonOffset(float factor, float bias);
virtual void DepthRangef(float min, float max);
virtual void BlendEquationSeparate(u16 rgb, u16 a);
virtual void BlendFuncSeparate(u16 srcRGB, u16 dstRGB, u16 srcAlpha, u16 dstAlpha);
virtual void BlendColor(u8 r, u8 g, u8 b, u8 a);
virtual void LightModeli(u32 enable);
virtual void ShadeModel(u32 mode);
virtual void DepthBoundsEXT(float min, float max);
virtual void Scissor(u16 x, u16 y, u16 width, u16 height);
virtual void Flip(); virtual void Flip();
}; };

View File

@ -6,76 +6,43 @@ class NullGSRender
{ {
public: public:
NullGSRender() NullGSRender() {}
{ virtual ~NullGSRender() {}
}
virtual ~NullGSRender()
{
}
private: private:
virtual void OnInit() virtual void OnInit() {}
{ virtual void OnInitThread() {}
} virtual void OnExitThread() {}
virtual void OnReset() {}
virtual void OnInitThread() virtual void Enable(u32 cmd, u32 enable) {}
{ virtual void ClearColor(u32 a, u32 r, u32 g, u32 b) {}
} virtual void ClearStencil(u32 stencil) {}
virtual void ClearDepth(u32 depth) {}
virtual void OnExitThread() virtual void ClearSurface(u32 mask) {}
{ virtual void ColorMask(bool a, bool r, bool g, bool b) {}
} virtual void ExecCMD() {}
virtual void AlphaFunc(u32 func, float ref) {}
virtual void OnReset() virtual void DepthFunc(u32 func) {}
{ virtual void DepthMask(u32 flag) {}
} virtual void PolygonMode(u32 face, u32 mode) {}
virtual void PointSize(float size) {}
virtual void Enable(u32 cmd, u32 enable) virtual void LogicOp(u32 opcdoe) {}
{ virtual void LineWidth(float width) {}
} virtual void LineStipple(u16 factor, u16 pattern) {}
virtual void PrimitiveRestartIndex(u32 index) {}
virtual void ClearColor(u32 a, u32 r, u32 g, u32 b) virtual void CullFace(u32 mode) {}
{ virtual void FrontFace(u32 mode) {}
} virtual void Fogi(u32 mode) {}
virtual void Fogf(float start, float end) {}
virtual void ClearStencil(u32 stencil) virtual void PolygonOffset(float factor, float bias) {}
{ virtual void DepthRangef(float min, float max) {}
} virtual void BlendEquationSeparate(u16 rgb, u16 a) {}
virtual void BlendFuncSeparate(u16 srcRGB, u16 dstRGB, u16 srcAlpha, u16 dstAlpha) {}
virtual void ClearDepth(u32 depth) virtual void BlendColor(u8 r, u8 g, u8 b, u8 a) {}
{ virtual void LightModeli(u32 enable) {}
} virtual void ShadeModel(u32 mode) {}
virtual void DepthBoundsEXT(float min, float max) {}
virtual void ClearSurface(u32 mask) virtual void Scissor(u16 x, u16 y, u16 width, u16 height) {}
{ virtual void Flip() {}
} virtual void Close() {}
virtual void ColorMask(bool a, bool r, bool g, bool b)
{
}
virtual void ExecCMD()
{
}
virtual void AlphaFunc(u32 func, float ref)
{
}
virtual void DepthFunc(u32 func)
{
}
virtual void DepthMask(u32 flag)
{
}
virtual void Flip()
{
}
virtual void Close()
{
}
}; };

View File

@ -599,14 +599,15 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_CULL_FACE: case NV4097_SET_CULL_FACE:
{ {
const u32 value = ARGS(0); const u32 value = ARGS(0);
Enable(cmd, value); CullFace(value);
} }
break; break;
// Front face // Front face
case NV4097_SET_FRONT_FACE: case NV4097_SET_FRONT_FACE:
{ {
m_front_face = ARGS(0); const u32 value = ARGS(0);
FrontFace(value);
} }
break; break;
@ -628,34 +629,38 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_BLEND_FUNC_SFACTOR: case NV4097_SET_BLEND_FUNC_SFACTOR:
{ {
const u32 value = ARGS(0);
m_set_blend_sfactor = true; m_set_blend_sfactor = true;
m_blend_sfactor_rgb = ARGS(0) & 0xffff; m_blend_sfactor_rgb = value & 0xffff;
m_blend_sfactor_alpha = ARGS(0) >> 16; m_blend_sfactor_alpha = value >> 16;
if (count == 2) if (count == 2)
{ {
m_set_blend_dfactor = true; const u32 value1 = ARGS(1);
m_blend_dfactor_rgb = ARGS(1) & 0xffff; m_blend_dfactor_rgb = value1 & 0xffff;
m_blend_dfactor_alpha = ARGS(1) >> 16; m_blend_dfactor_alpha = value1 >> 16;
BlendFuncSeparate(m_blend_sfactor_rgb, m_blend_dfactor_rgb, m_blend_sfactor_alpha, m_blend_dfactor_alpha);
} }
} }
break; break;
case NV4097_SET_BLEND_FUNC_DFACTOR: case NV4097_SET_BLEND_FUNC_DFACTOR:
{ {
m_set_blend_dfactor = true; const u32 value = ARGS(0);
m_blend_dfactor_rgb = ARGS(0) & 0xffff; m_blend_dfactor_rgb = value & 0xffff;
m_blend_dfactor_alpha = ARGS(0) >> 16; m_blend_dfactor_alpha = value >> 16;
if (m_set_blend_sfactor)
{
BlendFuncSeparate(m_blend_sfactor_rgb, m_blend_dfactor_rgb, m_blend_sfactor_alpha, m_blend_dfactor_alpha);
}
} }
break; break;
case NV4097_SET_BLEND_COLOR: case NV4097_SET_BLEND_COLOR:
{ {
m_set_blend_color = true; const u32 value = ARGS(0);
m_blend_color_r = ARGS(0) & 0xff; BlendColor(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff);
m_blend_color_g = (ARGS(0) >> 8) & 0xff;
m_blend_color_b = (ARGS(0) >> 16) & 0xff;
m_blend_color_a = (ARGS(0) >> 24) & 0xff;
} }
break; break;
@ -670,9 +675,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_BLEND_EQUATION: case NV4097_SET_BLEND_EQUATION:
{ {
m_set_blend_equation = true; const u32 value = ARGS(0);
m_blend_equation_rgb = ARGS(0) & 0xffff; BlendEquationSeparate(value & 0xffff, value >> 16);
m_blend_equation_alpha = ARGS(0) >> 16;
} }
break; break;
@ -695,23 +699,28 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_DEPTH_BOUNDS_MIN: case NV4097_SET_DEPTH_BOUNDS_MIN:
{ {
const u32 value = ARGS(0);
m_set_depth_bounds = true; m_set_depth_bounds = true;
const u32 a0 = ARGS(0); m_depth_bounds_min = (float&)value;
m_depth_bounds_min = (float&)a0;
if (count == 2) if (count == 2)
{ {
const u32 a1 = ARGS(1); const u32 value1 = ARGS(1);
m_depth_bounds_max = (float&)a1; m_depth_bounds_max = (float&)value1;
DepthBoundsEXT(m_depth_bounds_min, m_depth_bounds_max);
} }
} }
break; break;
case NV4097_SET_DEPTH_BOUNDS_MAX: case NV4097_SET_DEPTH_BOUNDS_MAX:
{ {
m_set_depth_bounds = true; const u32 value = ARGS(0);
const u32 a0 = ARGS(0); m_depth_bounds_max = (float&)value;
m_depth_bounds_max = (float&)a0;
if (m_set_depth_bounds)
{
DepthBoundsEXT(m_depth_bounds_min, m_depth_bounds_max);
}
} }
break; break;
@ -753,25 +762,17 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Clipping // Clipping
case NV4097_SET_CLIP_MIN: case NV4097_SET_CLIP_MIN:
{ {
const u32 a0 = ARGS(0); const u32 value = ARGS(0);
const u32 a1 = ARGS(1); m_clip_min = (float&)value;
DepthRangef(m_clip_min, m_clip_max);
m_set_clip = true;
m_clip_min = (float&)a0;
m_clip_max = (float&)a1;
//LOG_NOTICE(RSX, "NV4097_SET_CLIP_MIN: clip_min=%.01f, clip_max=%.01f", m_clip_min, m_clip_max);
} }
break; break;
case NV4097_SET_CLIP_MAX: case NV4097_SET_CLIP_MAX:
{ {
const u32 a0 = ARGS(0); const u32 value = ARGS(0);
m_clip_max = (float&)value;
m_set_clip = true; DepthRangef(m_clip_min, m_clip_max);
m_clip_max = (float&)a0;
//LOG_NOTICE(RSX, "NV4097_SET_CLIP_MAX: clip_max=%.01f", m_clip_max);
} }
break; break;
@ -804,15 +805,15 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Polygon mode/offset // Polygon mode/offset
case NV4097_SET_FRONT_POLYGON_MODE: case NV4097_SET_FRONT_POLYGON_MODE:
{ {
m_set_front_polygon_mode = true; const u32 value = ARGS(0);
m_front_polygon_mode = ARGS(0); PolygonMode(cmd, value);
} }
break; break;
case NV4097_SET_BACK_POLYGON_MODE: case NV4097_SET_BACK_POLYGON_MODE:
{ {
m_set_back_polygon_mode = true; const u32 value = ARGS(0);
m_back_polygon_mode = ARGS(0); PolygonMode(cmd, value);
} }
break; break;
@ -839,15 +840,16 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_POLYGON_OFFSET_SCALE_FACTOR: case NV4097_SET_POLYGON_OFFSET_SCALE_FACTOR:
{ {
Enable(NV4097_SET_DEPTH_TEST_ENABLE, 1); Enable(NV4097_SET_DEPTH_TEST_ENABLE, 1);
m_set_poly_offset_mode = true;
const u32 a0 = ARGS(0); const u32 value = ARGS(0);
m_poly_offset_scale_factor = (float&)a0; m_set_poly_offset_mode = true;
m_poly_offset_scale_factor = (float&)value;
if (count == 2) if (count == 2)
{ {
const u32 a1 = ARGS(1); const u32 value1 = ARGS(1);
m_poly_offset_bias = (float&)a1; m_poly_offset_bias = (float&)value1;
PolygonOffset(m_poly_offset_scale_factor, m_poly_offset_bias);
} }
} }
break; break;
@ -855,10 +857,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_POLYGON_OFFSET_BIAS: case NV4097_SET_POLYGON_OFFSET_BIAS:
{ {
Enable(NV4097_SET_DEPTH_TEST_ENABLE, 1); Enable(NV4097_SET_DEPTH_TEST_ENABLE, 1);
m_set_poly_offset_mode = true;
const u32 a0 = ARGS(0); const u32 value = ARGS(0);
m_poly_offset_bias = (float&)a0; m_poly_offset_bias = (float&)value;
if (m_set_poly_offset_mode)
{
PolygonOffset(m_poly_offset_scale_factor, m_poly_offset_bias);
}
} }
break; break;
@ -1085,8 +1091,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_SHADE_MODE: case NV4097_SET_SHADE_MODE:
{ {
m_set_shade_mode = true; const u32 value = ARGS(0);
m_shade_mode = ARGS(0); ShadeModel(value);
} }
break; break;
@ -1241,7 +1247,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_LOGIC_OP: case NV4097_SET_LOGIC_OP:
{ {
m_logic_op = ARGS(0); const u32 value = ARGS(0);
LogicOp(value);
} }
break; break;
@ -1269,7 +1276,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_TWO_SIDE_LIGHT_EN: case NV4097_SET_TWO_SIDE_LIGHT_EN:
{ {
m_set_two_side_light_enable = ARGS(0) ? true : false; const u32 value = ARGS(0);
LightModeli(value);
} }
break; break;
@ -1410,16 +1418,16 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_RESTART_INDEX: case NV4097_SET_RESTART_INDEX:
{ {
m_restart_index = ARGS(0); const u32 value = ARGS(0);
PrimitiveRestartIndex(value);
} }
break; break;
// Point size // Point size
case NV4097_SET_POINT_SIZE: case NV4097_SET_POINT_SIZE:
{ {
m_set_point_size = true; const u32 value = ARGS(0);
const u32 a0 = ARGS(0); PointSize((float&)value);
m_point_size = (float&)a0;
} }
break; break;
@ -1454,24 +1462,31 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Scissor // Scissor
case NV4097_SET_SCISSOR_HORIZONTAL: case NV4097_SET_SCISSOR_HORIZONTAL:
{ {
const u32 value = ARGS(0);
m_set_scissor_horizontal = true; m_set_scissor_horizontal = true;
m_scissor_x = ARGS(0) & 0xffff; m_scissor_x = value & 0xffff;
m_scissor_w = ARGS(0) >> 16; m_scissor_w = value >> 16;
if (count == 2) if (count == 2)
{ {
m_set_scissor_vertical = true; const u32 value1 = ARGS(1);
m_scissor_y = ARGS(1) & 0xffff; m_scissor_y = value1 & 0xffff;
m_scissor_h = ARGS(1) >> 16; m_scissor_h = value1 >> 16;
Scissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h);
} }
} }
break; break;
case NV4097_SET_SCISSOR_VERTICAL: case NV4097_SET_SCISSOR_VERTICAL:
{ {
m_set_scissor_vertical = true; const u32 value = ARGS(0);
m_scissor_y = ARGS(0) & 0xffff; m_scissor_y = value & 0xffff;
m_scissor_h = ARGS(0) >> 16; m_scissor_h = value >> 16;
if (m_set_scissor_horizontal)
{
Scissor(m_scissor_x, m_scissor_y, m_scissor_w, m_scissor_h);
}
} }
break; break;
@ -1720,9 +1735,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Line width // Line width
case NV4097_SET_LINE_WIDTH: case NV4097_SET_LINE_WIDTH:
{ {
m_set_line_width = true; const u32 value = ARGS(0);
const u32 a0 = ARGS(0); LineWidth((float)value / 8.0f);
m_line_width = (float)a0 / 8.0f;
} }
break; break;
@ -1736,10 +1750,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
case NV4097_SET_LINE_STIPPLE_PATTERN: case NV4097_SET_LINE_STIPPLE_PATTERN:
{ {
m_set_line_stipple = true; const u32 value = ARGS(0);
const u32 a0 = ARGS(0); LineStipple(value & 0xffff, value >> 16);
m_line_stipple_factor = a0 & 0xffff;
m_line_stipple_pattern = a0 >> 16;
} }
break; break;
@ -1869,18 +1881,16 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const
// Fog // Fog
case NV4097_SET_FOG_MODE: case NV4097_SET_FOG_MODE:
{ {
m_set_fog_mode = true; const u32 value = ARGS(0);
m_fog_mode = ARGS(0); Fogi(value);
} }
break; break;
case NV4097_SET_FOG_PARAMS: case NV4097_SET_FOG_PARAMS:
{ {
m_set_fog_params = true; const u32 start = ARGS(0);
const u32 a0 = ARGS(0); const u32 end = ARGS(1);
const u32 a1 = ARGS(1); Fogf((float&)start, (float&)end);
m_fog_param0 = (float&)a0;
m_fog_param1 = (float&)a1;
} }
break; break;

View File

@ -641,6 +641,25 @@ protected:
virtual void AlphaFunc(u32 func, float ref) = 0; virtual void AlphaFunc(u32 func, float ref) = 0;
virtual void DepthFunc(u32 func) = 0; virtual void DepthFunc(u32 func) = 0;
virtual void DepthMask(u32 flag) = 0; virtual void DepthMask(u32 flag) = 0;
virtual void PolygonMode(u32 face, u32 mode) = 0;
virtual void PointSize(float size) = 0;
virtual void LogicOp(u32 opcdoe) = 0;
virtual void LineWidth(float width) = 0;
virtual void LineStipple(u16 factor, u16 pattern) = 0;
virtual void PrimitiveRestartIndex(u32 index) = 0;
virtual void CullFace(u32 mode) = 0;
virtual void FrontFace(u32 mode) = 0;
virtual void Fogi(u32 mode) = 0;
virtual void Fogf(float start, float end) = 0;
virtual void PolygonOffset(float factor, float bias) = 0;
virtual void DepthRangef(float min, float max) = 0;
virtual void BlendEquationSeparate(u16 rgb, u16 a) = 0;
virtual void BlendFuncSeparate(u16 srcRGB, u16 dstRGB, u16 srcAlpha, u16 dstAlpha) = 0;
virtual void BlendColor(u8 r, u8 g, u8 b, u8 a) = 0;
virtual void LightModeli(u32 enable) = 0;
virtual void ShadeModel(u32 mode) = 0;
virtual void DepthBoundsEXT(float min, float max) = 0;
virtual void Scissor(u16 x, u16 y, u16 width, u16 height) = 0;
virtual void Flip() = 0; virtual void Flip() = 0;
void LoadVertexData(u32 first, u32 count) void LoadVertexData(u32 first, u32 count)