Commit 5ab5202e authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

wined3d: Set shader specific caps in the shader backend.

The whole control structures in directx.c get terribly confusing with the various codepaths for texturing and different shader implementations. It is also hard to reflect the shader model decisions this way too. This patch moves the shader specific parts of the caps code into the shader backend where we can set our caps dependent of the shader model decisions and without complex caps flag checks.
parent 8869c0f1
...@@ -2042,6 +2042,10 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF ...@@ -2042,6 +2042,10 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF
} }
} }
static void shader_arb_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *caps) {
none_shader_backend.shader_get_caps(devtype, gl_info, caps);
}
const shader_backend_t arb_program_shader_backend = { const shader_backend_t arb_program_shader_backend = {
&shader_arb_select, &shader_arb_select,
&shader_arb_select_depth_blt, &shader_arb_select_depth_blt,
...@@ -2055,5 +2059,6 @@ const shader_backend_t arb_program_shader_backend = { ...@@ -2055,5 +2059,6 @@ const shader_backend_t arb_program_shader_backend = {
&shader_arb_dirty_const, &shader_arb_dirty_const,
&shader_arb_generate_pshader, &shader_arb_generate_pshader,
&shader_arb_generate_vshader, &shader_arb_generate_vshader,
&shader_arb_get_caps,
FFPStateTable FFPStateTable
}; };
...@@ -3525,6 +3525,10 @@ static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF ...@@ -3525,6 +3525,10 @@ static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF
This->baseShader.prgId = shader_obj; This->baseShader.prgId = shader_obj;
} }
static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *caps) {
none_shader_backend.shader_get_caps(devtype, gl_info, caps);
}
const shader_backend_t glsl_shader_backend = { const shader_backend_t glsl_shader_backend = {
&shader_glsl_select, &shader_glsl_select,
&shader_glsl_select_depth_blt, &shader_glsl_select_depth_blt,
...@@ -3538,5 +3542,6 @@ const shader_backend_t glsl_shader_backend = { ...@@ -3538,5 +3542,6 @@ const shader_backend_t glsl_shader_backend = {
&shader_glsl_dirty_const, &shader_glsl_dirty_const,
&shader_glsl_generate_pshader, &shader_glsl_generate_pshader,
&shader_glsl_generate_vshader, &shader_glsl_generate_vshader,
&shader_glsl_get_caps,
FFPStateTable FFPStateTable
}; };
...@@ -257,6 +257,26 @@ typedef struct SHADER_BUFFER { ...@@ -257,6 +257,26 @@ typedef struct SHADER_BUFFER {
BOOL newline; BOOL newline;
} SHADER_BUFFER; } SHADER_BUFFER;
struct shader_caps {
DWORD TextureOpCaps;
DWORD MaxTextureBlendStages;
DWORD MaxSimultaneousTextures;
DWORD VertexShaderVersion;
DWORD MaxVertexShaderConst;
DWORD PixelShaderVersion;
float PixelShader1xMaxValue;
WINED3DVSHADERCAPS2_0 VS20Caps;
WINED3DPSHADERCAPS2_0 PS20Caps;
DWORD MaxVShaderInstructionsExecuted;
DWORD MaxPShaderInstructionsExecuted;
DWORD MaxVertexShader30InstructionSlots;
DWORD MaxPixelShader30InstructionSlots;
};
typedef struct { typedef struct {
void (*shader_select)(IWineD3DDevice *iface, BOOL usePS, BOOL useVS); void (*shader_select)(IWineD3DDevice *iface, BOOL usePS, BOOL useVS);
void (*shader_select_depth_blt)(IWineD3DDevice *iface); void (*shader_select_depth_blt)(IWineD3DDevice *iface);
...@@ -270,6 +290,7 @@ typedef struct { ...@@ -270,6 +290,7 @@ typedef struct {
BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface); BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface);
void (*shader_generate_pshader)(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer); void (*shader_generate_pshader)(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer);
void (*shader_generate_vshader)(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer); void (*shader_generate_vshader)(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer);
void (*shader_get_caps)(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *caps);
const struct StateEntry *StateTable; const struct StateEntry *StateTable;
} shader_backend_t; } shader_backend_t;
...@@ -2359,4 +2380,9 @@ static inline BOOL use_ps(IWineD3DDeviceImpl *device) { ...@@ -2359,4 +2380,9 @@ static inline BOOL use_ps(IWineD3DDeviceImpl *device) {
void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect, void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect,
IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip); IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip);
void select_shader_mode(
WineD3D_GL_Info *gl_info,
WINED3DDEVTYPE DeviceType,
int* ps_selected,
int* vs_selected);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment