wined3d: GL_ARB_fragment_program ffp implementation.

This commit is contained in:
Stefan Dösinger 2008-07-28 11:41:02 -05:00 committed by Alexandre Julliard
parent bc4435e406
commit 14b24058d6
4 changed files with 946 additions and 143 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2234,8 +2234,8 @@ err_out:
IWineD3DStateBlock_Release((IWineD3DStateBlock *) This->stateBlock); IWineD3DStateBlock_Release((IWineD3DStateBlock *) This->stateBlock);
This->stateBlock = NULL; This->stateBlock = NULL;
} }
This->shader_backend->shader_free_private(iface);
This->frag_pipe->free_private(iface); This->frag_pipe->free_private(iface);
This->shader_backend->shader_free_private(iface);
return hr; return hr;
} }
@ -2324,8 +2324,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D
} }
/* Destroy the shader backend. Note that this has to happen after all shaders are destroyed. */ /* Destroy the shader backend. Note that this has to happen after all shaders are destroyed. */
This->shader_backend->shader_free_private(iface);
This->frag_pipe->free_private(iface); This->frag_pipe->free_private(iface);
This->shader_backend->shader_free_private(iface);
/* Release the buffers (with sanity checks)*/ /* Release the buffers (with sanity checks)*/
TRACE("Releasing the depth stencil buffer at %p\n", This->stencilBufferTarget); TRACE("Releasing the depth stencil buffer at %p\n", This->stencilBufferTarget);
@ -7252,8 +7252,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
This->depth_blt_rb_w = 0; This->depth_blt_rb_w = 0;
This->depth_blt_rb_h = 0; This->depth_blt_rb_h = 0;
} }
This->shader_backend->shader_free_private(iface);
This->frag_pipe->free_private(iface); This->frag_pipe->free_private(iface);
This->shader_backend->shader_free_private(iface);
for (i = 0; i < GL_LIMITS(textures); i++) { for (i = 0; i < GL_LIMITS(textures); i++) {
/* Textures are recreated below */ /* Textures are recreated below */

View File

@ -1963,6 +1963,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter
/* Check if we support bumpmapping for a format */ /* Check if we support bumpmapping for a format */
static BOOL CheckBumpMapCapability(UINT Adapter, WINED3DFORMAT CheckFormat) static BOOL CheckBumpMapCapability(UINT Adapter, WINED3DFORMAT CheckFormat)
{ {
/* TODO: Check this in the fixed function pipeline backend */
if(GL_SUPPORT(NV_REGISTER_COMBINERS) && GL_SUPPORT(NV_TEXTURE_SHADER2)) { if(GL_SUPPORT(NV_REGISTER_COMBINERS) && GL_SUPPORT(NV_TEXTURE_SHADER2)) {
switch (CheckFormat) { switch (CheckFormat) {
case WINED3DFMT_V8U8: case WINED3DFMT_V8U8:
@ -1984,6 +1985,20 @@ static BOOL CheckBumpMapCapability(UINT Adapter, WINED3DFORMAT CheckFormat)
return FALSE; return FALSE;
} }
} }
if(GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) {
switch (CheckFormat) {
case WINED3DFMT_V8U8:
case WINED3DFMT_V16U16:
case WINED3DFMT_L6V5U5:
case WINED3DFMT_X8L8V8U8:
case WINED3DFMT_Q8W8V8U8:
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
default:
TRACE_(d3d_caps)("[FAILED]\n");
return FALSE;
}
}
TRACE_(d3d_caps)("[FAILED]\n"); TRACE_(d3d_caps)("[FAILED]\n");
return FALSE; return FALSE;
} }
@ -2902,7 +2917,9 @@ static const struct fragment_pipeline *select_fragment_implementation(UINT Adapt
int ps_selected_mode; int ps_selected_mode;
select_shader_mode(&GLINFO_LOCATION, DeviceType, &ps_selected_mode, &vs_selected_mode); select_shader_mode(&GLINFO_LOCATION, DeviceType, &ps_selected_mode, &vs_selected_mode);
if(ps_selected_mode == SHADER_ATI) { if((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) && GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) {
return &arbfp_fragment_pipeline;
} else if(ps_selected_mode == SHADER_ATI) {
return &atifs_fragment_pipeline; return &atifs_fragment_pipeline;
} else if(GL_SUPPORT(NV_REGISTER_COMBINERS) && GL_SUPPORT(NV_TEXTURE_SHADER2)) { } else if(GL_SUPPORT(NV_REGISTER_COMBINERS) && GL_SUPPORT(NV_TEXTURE_SHADER2)) {
return &nvts_fragment_pipeline; return &nvts_fragment_pipeline;

View File

@ -267,6 +267,8 @@ struct shader_arb_priv {
GLuint current_fprogram_id; GLuint current_fprogram_id;
GLuint depth_blt_vprogram_id; GLuint depth_blt_vprogram_id;
GLuint depth_blt_fprogram_id; GLuint depth_blt_fprogram_id;
BOOL use_arbfp_fixed_func;
hash_table_t *fragment_shaders;
}; };
/* X11 locking */ /* X11 locking */
@ -561,6 +563,7 @@ extern const struct StateEntryTemplate misc_state_template[];
extern const struct StateEntryTemplate ffp_vertexstate_template[]; extern const struct StateEntryTemplate ffp_vertexstate_template[];
extern const struct fragment_pipeline ffp_fragment_pipeline; extern const struct fragment_pipeline ffp_fragment_pipeline;
extern const struct fragment_pipeline atifs_fragment_pipeline; extern const struct fragment_pipeline atifs_fragment_pipeline;
extern const struct fragment_pipeline arbfp_fragment_pipeline;
extern const struct fragment_pipeline nvts_fragment_pipeline; extern const struct fragment_pipeline nvts_fragment_pipeline;
extern const struct fragment_pipeline nvrc_fragment_pipeline; extern const struct fragment_pipeline nvrc_fragment_pipeline;