wined3d: Get rid of surface_load_ds_location().
This should be unused now that "AlwaysOffscreen" is gone. Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ff85cd5f4a
commit
1bd56b6ca5
|
@ -291,9 +291,6 @@ struct shader_arb_priv
|
|||
GLuint current_fprogram_id;
|
||||
const struct arb_ps_compiled_shader *compiled_fprog;
|
||||
const struct arb_vs_compiled_shader *compiled_vprog;
|
||||
GLuint depth_blt_vprogram_id;
|
||||
GLuint depth_blt_fprogram_id_full[WINED3D_GL_RES_TYPE_COUNT];
|
||||
GLuint depth_blt_fprogram_id_masked[WINED3D_GL_RES_TYPE_COUNT];
|
||||
BOOL use_arbfp_fixed_func;
|
||||
struct wine_rb_tree fragment_shaders;
|
||||
BOOL last_ps_const_clamped;
|
||||
|
@ -3358,120 +3355,6 @@ static BOOL shader_arb_compile(const struct wined3d_gl_info *gl_info, GLenum tar
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_info)
|
||||
{
|
||||
GLuint program_id = 0;
|
||||
|
||||
static const char blt_vprogram[] =
|
||||
"!!ARBvp1.0\n"
|
||||
"PARAM c[1] = { { 1, 0.5 } };\n"
|
||||
"MOV result.position, vertex.position;\n"
|
||||
"MOV result.color, c[0].x;\n"
|
||||
"MOV result.texcoord[0], vertex.texcoord[0];\n"
|
||||
"END\n";
|
||||
|
||||
GL_EXTCALL(glGenProgramsARB(1, &program_id));
|
||||
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, program_id));
|
||||
shader_arb_compile(gl_info, GL_VERTEX_PROGRAM_ARB, blt_vprogram);
|
||||
|
||||
return program_id;
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_info,
|
||||
enum wined3d_gl_resource_type tex_type, BOOL masked)
|
||||
{
|
||||
GLuint program_id = 0;
|
||||
const char *fprogram;
|
||||
|
||||
static const char * const blt_fprograms_full[WINED3D_GL_RES_TYPE_COUNT] =
|
||||
{
|
||||
/* WINED3D_GL_RES_TYPE_TEX_1D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_2D */
|
||||
"!!ARBfp1.0\n"
|
||||
"TEMP R0;\n"
|
||||
"TEX R0.x, fragment.texcoord[0], texture[0], 2D;\n"
|
||||
"MOV result.depth.z, R0.x;\n"
|
||||
"END\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_3D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_CUBE */
|
||||
"!!ARBfp1.0\n"
|
||||
"TEMP R0;\n"
|
||||
"TEX R0.x, fragment.texcoord[0], texture[0], CUBE;\n"
|
||||
"MOV result.depth.z, R0.x;\n"
|
||||
"END\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_RECT */
|
||||
"!!ARBfp1.0\n"
|
||||
"TEMP R0;\n"
|
||||
"TEX R0.x, fragment.texcoord[0], texture[0], RECT;\n"
|
||||
"MOV result.depth.z, R0.x;\n"
|
||||
"END\n",
|
||||
/* WINED3D_GL_RES_TYPE_BUFFER */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_RB */
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const char * const blt_fprograms_masked[WINED3D_GL_RES_TYPE_COUNT] =
|
||||
{
|
||||
/* WINED3D_GL_RES_TYPE_TEX_1D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_2D */
|
||||
"!!ARBfp1.0\n"
|
||||
"PARAM mask = program.local[0];\n"
|
||||
"TEMP R0;\n"
|
||||
"SLT R0.xy, fragment.position, mask.zwzw;\n"
|
||||
"MUL R0.x, R0.x, R0.y;\n"
|
||||
"KIL -R0.x;\n"
|
||||
"TEX R0.x, fragment.texcoord[0], texture[0], 2D;\n"
|
||||
"MOV result.depth.z, R0.x;\n"
|
||||
"END\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_3D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_CUBE */
|
||||
"!!ARBfp1.0\n"
|
||||
"PARAM mask = program.local[0];\n"
|
||||
"TEMP R0;\n"
|
||||
"SLT R0.xy, fragment.position, mask.zwzw;\n"
|
||||
"MUL R0.x, R0.x, R0.y;\n"
|
||||
"KIL -R0.x;\n"
|
||||
"TEX R0.x, fragment.texcoord[0], texture[0], CUBE;\n"
|
||||
"MOV result.depth.z, R0.x;\n"
|
||||
"END\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_RECT */
|
||||
"!!ARBfp1.0\n"
|
||||
"PARAM mask = program.local[0];\n"
|
||||
"TEMP R0;\n"
|
||||
"SLT R0.xy, fragment.position, mask.zwzw;\n"
|
||||
"MUL R0.x, R0.x, R0.y;\n"
|
||||
"KIL -R0.x;\n"
|
||||
"TEX R0.x, fragment.texcoord[0], texture[0], RECT;\n"
|
||||
"MOV result.depth.z, R0.x;\n"
|
||||
"END\n",
|
||||
/* WINED3D_GL_RES_TYPE_BUFFER */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_RB */
|
||||
NULL,
|
||||
};
|
||||
|
||||
fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type];
|
||||
if (!fprogram)
|
||||
{
|
||||
FIXME("tex_type %#x not supported, falling back to 2D\n", tex_type);
|
||||
tex_type = WINED3D_GL_RES_TYPE_TEX_2D;
|
||||
fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type];
|
||||
}
|
||||
|
||||
GL_EXTCALL(glGenProgramsARB(1, &program_id));
|
||||
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id));
|
||||
shader_arb_compile(gl_info, GL_FRAGMENT_PROGRAM_ARB, fprogram);
|
||||
|
||||
return program_id;
|
||||
}
|
||||
|
||||
static void arbfp_add_sRGB_correction(struct wined3d_string_buffer *buffer, const char *fragcolor,
|
||||
const char *tmp1, const char *tmp2, const char *tmp3, const char *tmp4, BOOL condcode)
|
||||
{
|
||||
|
@ -4853,56 +4736,6 @@ static void shader_arb_disable(void *shader_priv, struct wined3d_context *contex
|
|||
| (1u << WINED3D_SHADER_TYPE_COMPUTE);
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_arb_select_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info,
|
||||
enum wined3d_gl_resource_type tex_type, const SIZE *ds_mask_size)
|
||||
{
|
||||
const float mask[] = {0.0f, 0.0f, (float)ds_mask_size->cx, (float)ds_mask_size->cy};
|
||||
BOOL masked = ds_mask_size->cx && ds_mask_size->cy;
|
||||
struct shader_arb_priv *priv = shader_priv;
|
||||
GLuint *blt_fprogram;
|
||||
|
||||
if (!priv->depth_blt_vprogram_id) priv->depth_blt_vprogram_id = create_arb_blt_vertex_program(gl_info);
|
||||
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->depth_blt_vprogram_id));
|
||||
gl_info->gl_ops.gl.p_glEnable(GL_VERTEX_PROGRAM_ARB);
|
||||
|
||||
blt_fprogram = masked ? &priv->depth_blt_fprogram_id_masked[tex_type] : &priv->depth_blt_fprogram_id_full[tex_type];
|
||||
if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type, masked);
|
||||
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, *blt_fprogram));
|
||||
if (masked) GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, mask));
|
||||
gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_arb_deselect_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info)
|
||||
{
|
||||
struct shader_arb_priv *priv = shader_priv;
|
||||
|
||||
if (priv->current_vprogram_id) {
|
||||
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id));
|
||||
checkGLcall("glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vertexShader->prgId);");
|
||||
|
||||
TRACE("Bound vertex program %u and enabled GL_VERTEX_PROGRAM_ARB.\n", priv->current_vprogram_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_VERTEX_PROGRAM_ARB);
|
||||
checkGLcall("glDisable(GL_VERTEX_PROGRAM_ARB)");
|
||||
}
|
||||
|
||||
if (priv->current_fprogram_id) {
|
||||
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id));
|
||||
checkGLcall("glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, pixelShader->prgId);");
|
||||
|
||||
TRACE("Bound fragment program %u and enabled GL_FRAGMENT_PROGRAM_ARB.\n", priv->current_fprogram_id);
|
||||
}
|
||||
else if(!priv->use_arbfp_fixed_func)
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
checkGLcall("glDisable(GL_FRAGMENT_PROGRAM_ARB)");
|
||||
}
|
||||
}
|
||||
|
||||
static void shader_arb_destroy(struct wined3d_shader *shader)
|
||||
{
|
||||
struct wined3d_device *device = shader->device;
|
||||
|
@ -5022,24 +4855,7 @@ static void release_signature(struct wine_rb_entry *entry, void *context)
|
|||
/* Context activation is done by the caller. */
|
||||
static void shader_arb_free(struct wined3d_device *device)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
struct shader_arb_priv *priv = device->shader_priv;
|
||||
int i;
|
||||
|
||||
if (priv->depth_blt_vprogram_id)
|
||||
GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_vprogram_id));
|
||||
|
||||
for (i = 0; i < WINED3D_GL_RES_TYPE_COUNT; ++i)
|
||||
{
|
||||
if (priv->depth_blt_fprogram_id_full[i])
|
||||
{
|
||||
GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id_full[i]));
|
||||
}
|
||||
if (priv->depth_blt_fprogram_id_masked[i])
|
||||
{
|
||||
GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id_masked[i]));
|
||||
}
|
||||
}
|
||||
|
||||
wine_rb_destroy(&priv->signature_tree, release_signature, NULL);
|
||||
priv->fragment_pipe->free_private(device);
|
||||
|
@ -5837,8 +5653,6 @@ const struct wined3d_shader_backend_ops arb_program_shader_backend =
|
|||
shader_arb_handle_instruction,
|
||||
shader_arb_select,
|
||||
shader_arb_disable,
|
||||
shader_arb_select_depth_blt,
|
||||
shader_arb_deselect_depth_blt,
|
||||
shader_arb_update_float_vertex_constants,
|
||||
shader_arb_update_float_pixel_constants,
|
||||
shader_arb_load_constants,
|
||||
|
|
|
@ -121,8 +121,6 @@ struct shader_glsl_priv {
|
|||
struct constant_heap vconst_heap;
|
||||
struct constant_heap pconst_heap;
|
||||
unsigned char *stack;
|
||||
GLuint depth_blt_program_full[WINED3D_GL_RES_TYPE_COUNT];
|
||||
GLuint depth_blt_program_masked[WINED3D_GL_RES_TYPE_COUNT];
|
||||
UINT next_constant_version;
|
||||
|
||||
const struct wined3d_vertex_pipe_ops *vertex_pipe;
|
||||
|
@ -8289,125 +8287,6 @@ static void set_glsl_shader_program(const struct wined3d_context *context, const
|
|||
}
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static GLuint create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum wined3d_gl_resource_type tex_type,
|
||||
BOOL masked)
|
||||
{
|
||||
GLuint program_id;
|
||||
GLuint vshader_id, pshader_id;
|
||||
const char *blt_pshader;
|
||||
|
||||
static const char blt_vshader[] =
|
||||
"#version 120\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" gl_Position = gl_Vertex;\n"
|
||||
" gl_FrontColor = vec4(1.0);\n"
|
||||
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
|
||||
"}\n";
|
||||
|
||||
static const char * const blt_pshaders_full[WINED3D_GL_RES_TYPE_COUNT] =
|
||||
{
|
||||
/* WINED3D_GL_RES_TYPE_TEX_1D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_2D */
|
||||
"#version 120\n"
|
||||
"uniform sampler2D sampler;\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" gl_FragDepth = texture2D(sampler, gl_TexCoord[0].xy).x;\n"
|
||||
"}\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_3D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_CUBE */
|
||||
"#version 120\n"
|
||||
"uniform samplerCube sampler;\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" gl_FragDepth = textureCube(sampler, gl_TexCoord[0].xyz).x;\n"
|
||||
"}\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_RECT */
|
||||
"#version 120\n"
|
||||
"#extension GL_ARB_texture_rectangle : enable\n"
|
||||
"uniform sampler2DRect sampler;\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" gl_FragDepth = texture2DRect(sampler, gl_TexCoord[0].xy).x;\n"
|
||||
"}\n",
|
||||
/* WINED3D_GL_RES_TYPE_BUFFER */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_RB */
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const char * const blt_pshaders_masked[WINED3D_GL_RES_TYPE_COUNT] =
|
||||
{
|
||||
/* WINED3D_GL_RES_TYPE_TEX_1D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_2D */
|
||||
"#version 120\n"
|
||||
"uniform sampler2D sampler;\n"
|
||||
"uniform vec4 mask;\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
|
||||
" gl_FragDepth = texture2D(sampler, gl_TexCoord[0].xy).x;\n"
|
||||
"}\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_3D */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_TEX_CUBE */
|
||||
"#version 120\n"
|
||||
"uniform samplerCube sampler;\n"
|
||||
"uniform vec4 mask;\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
|
||||
" gl_FragDepth = textureCube(sampler, gl_TexCoord[0].xyz).x;\n"
|
||||
"}\n",
|
||||
/* WINED3D_GL_RES_TYPE_TEX_RECT */
|
||||
"#version 120\n"
|
||||
"#extension GL_ARB_texture_rectangle : enable\n"
|
||||
"uniform sampler2DRect sampler;\n"
|
||||
"uniform vec4 mask;\n"
|
||||
"void main(void)\n"
|
||||
"{\n"
|
||||
" if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
|
||||
" gl_FragDepth = texture2DRect(sampler, gl_TexCoord[0].xy).x;\n"
|
||||
"}\n",
|
||||
/* WINED3D_GL_RES_TYPE_BUFFER */
|
||||
NULL,
|
||||
/* WINED3D_GL_RES_TYPE_RB */
|
||||
NULL,
|
||||
};
|
||||
|
||||
blt_pshader = masked ? blt_pshaders_masked[tex_type] : blt_pshaders_full[tex_type];
|
||||
if (!blt_pshader)
|
||||
{
|
||||
FIXME("tex_type %#x not supported\n", tex_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
vshader_id = GL_EXTCALL(glCreateShader(GL_VERTEX_SHADER));
|
||||
shader_glsl_compile(gl_info, vshader_id, blt_vshader);
|
||||
|
||||
pshader_id = GL_EXTCALL(glCreateShader(GL_FRAGMENT_SHADER));
|
||||
shader_glsl_compile(gl_info, pshader_id, blt_pshader);
|
||||
|
||||
program_id = GL_EXTCALL(glCreateProgram());
|
||||
GL_EXTCALL(glAttachShader(program_id, vshader_id));
|
||||
GL_EXTCALL(glAttachShader(program_id, pshader_id));
|
||||
GL_EXTCALL(glLinkProgram(program_id));
|
||||
|
||||
shader_glsl_validate_link(gl_info, program_id);
|
||||
|
||||
/* Once linked we can mark the shaders for deletion. They will be deleted once the program
|
||||
* is destroyed
|
||||
*/
|
||||
GL_EXTCALL(glDeleteShader(vshader_id));
|
||||
GL_EXTCALL(glDeleteShader(pshader_id));
|
||||
return program_id;
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_glsl_select(void *shader_priv, struct wined3d_context *context,
|
||||
const struct wined3d_state *state)
|
||||
|
@ -8504,48 +8383,6 @@ static void shader_glsl_disable(void *shader_priv, struct wined3d_context *conte
|
|||
}
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_glsl_select_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info,
|
||||
enum wined3d_gl_resource_type tex_type, const SIZE *ds_mask_size)
|
||||
{
|
||||
BOOL masked = ds_mask_size->cx && ds_mask_size->cy;
|
||||
struct shader_glsl_priv *priv = shader_priv;
|
||||
GLuint *blt_program;
|
||||
GLint loc;
|
||||
|
||||
blt_program = masked ? &priv->depth_blt_program_masked[tex_type] : &priv->depth_blt_program_full[tex_type];
|
||||
if (!*blt_program)
|
||||
{
|
||||
*blt_program = create_glsl_blt_shader(gl_info, tex_type, masked);
|
||||
loc = GL_EXTCALL(glGetUniformLocation(*blt_program, "sampler"));
|
||||
GL_EXTCALL(glUseProgram(*blt_program));
|
||||
GL_EXTCALL(glUniform1i(loc, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_EXTCALL(glUseProgram(*blt_program));
|
||||
}
|
||||
|
||||
if (masked)
|
||||
{
|
||||
loc = GL_EXTCALL(glGetUniformLocation(*blt_program, "mask"));
|
||||
GL_EXTCALL(glUniform4f(loc, 0.0f, 0.0f, (float)ds_mask_size->cx, (float)ds_mask_size->cy));
|
||||
}
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void shader_glsl_deselect_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info)
|
||||
{
|
||||
const struct glsl_context_data *ctx_data = context_get_current()->shader_backend_data;
|
||||
GLuint program_id;
|
||||
|
||||
program_id = ctx_data->glsl_program ? ctx_data->glsl_program->id : 0;
|
||||
if (program_id) TRACE("Using GLSL program %u\n", program_id);
|
||||
|
||||
GL_EXTCALL(glUseProgram(program_id));
|
||||
checkGLcall("glUseProgram");
|
||||
}
|
||||
|
||||
static void shader_glsl_invalidate_contexts_program(struct wined3d_device *device,
|
||||
const struct glsl_shader_prog_link *program)
|
||||
{
|
||||
|
@ -8794,21 +8631,7 @@ fail:
|
|||
/* Context activation is done by the caller. */
|
||||
static void shader_glsl_free(struct wined3d_device *device)
|
||||
{
|
||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||
struct shader_glsl_priv *priv = device->shader_priv;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < WINED3D_GL_RES_TYPE_COUNT; ++i)
|
||||
{
|
||||
if (priv->depth_blt_program_full[i])
|
||||
{
|
||||
GL_EXTCALL(glDeleteProgram(priv->depth_blt_program_full[i]));
|
||||
}
|
||||
if (priv->depth_blt_program_masked[i])
|
||||
{
|
||||
GL_EXTCALL(glDeleteProgram(priv->depth_blt_program_masked[i]));
|
||||
}
|
||||
}
|
||||
|
||||
wine_rb_destroy(&priv->program_lookup, NULL, NULL);
|
||||
constant_heap_free(&priv->pconst_heap);
|
||||
|
@ -9172,8 +8995,6 @@ const struct wined3d_shader_backend_ops glsl_shader_backend =
|
|||
shader_glsl_handle_instruction,
|
||||
shader_glsl_select,
|
||||
shader_glsl_disable,
|
||||
shader_glsl_select_depth_blt,
|
||||
shader_glsl_deselect_depth_blt,
|
||||
shader_glsl_update_float_vertex_constants,
|
||||
shader_glsl_update_float_pixel_constants,
|
||||
shader_glsl_load_constants,
|
||||
|
|
|
@ -2653,9 +2653,6 @@ struct shader_none_priv
|
|||
};
|
||||
|
||||
static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
|
||||
static void shader_none_select_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info,
|
||||
enum wined3d_gl_resource_type tex_type, const SIZE *ds_mask_size) {}
|
||||
static void shader_none_deselect_depth_blt(void *shader_priv, const struct wined3d_gl_info *gl_info) {}
|
||||
static void shader_none_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count) {}
|
||||
static void shader_none_update_float_pixel_constants(struct wined3d_device *device, UINT start, UINT count) {}
|
||||
static void shader_none_load_constants(void *shader_priv, struct wined3d_context *context,
|
||||
|
@ -2778,8 +2775,6 @@ const struct wined3d_shader_backend_ops none_shader_backend =
|
|||
shader_none_handle_instruction,
|
||||
shader_none_select,
|
||||
shader_none_disable,
|
||||
shader_none_select_depth_blt,
|
||||
shader_none_deselect_depth_blt,
|
||||
shader_none_update_float_vertex_constants,
|
||||
shader_none_update_float_pixel_constants,
|
||||
shader_none_load_constants,
|
||||
|
|
|
@ -2489,68 +2489,6 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE
|
|||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void surface_depth_blt(const struct wined3d_surface *surface, struct wined3d_context *context,
|
||||
GLuint texture, GLint x, GLint y, GLsizei w, GLsizei h, GLenum target)
|
||||
{
|
||||
struct wined3d_device *device = surface->container->resource.device;
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
GLint compare_mode = GL_NONE;
|
||||
struct blt_info info;
|
||||
GLint old_binding = 0;
|
||||
RECT rect;
|
||||
|
||||
gl_info->gl_ops.gl.p_glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_VIEWPORT_BIT);
|
||||
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_CULL_FACE);
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_ALPHA_TEST);
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_SCISSOR_TEST);
|
||||
gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST);
|
||||
gl_info->gl_ops.gl.p_glEnable(GL_DEPTH_TEST);
|
||||
gl_info->gl_ops.gl.p_glDepthFunc(GL_ALWAYS);
|
||||
gl_info->gl_ops.gl.p_glDepthMask(GL_TRUE);
|
||||
gl_info->gl_ops.gl.p_glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
gl_info->gl_ops.gl.p_glViewport(x, y, w, h);
|
||||
gl_info->gl_ops.gl.p_glDepthRange(0.0, 1.0);
|
||||
|
||||
SetRect(&rect, 0, h, w, 0);
|
||||
surface_get_blt_info(target, &rect,
|
||||
wined3d_texture_get_level_pow2_width(surface->container, surface->texture_level),
|
||||
wined3d_texture_get_level_pow2_height(surface->container, surface->texture_level), &info);
|
||||
context_active_texture(context, context->gl_info, 0);
|
||||
gl_info->gl_ops.gl.p_glGetIntegerv(info.binding, &old_binding);
|
||||
gl_info->gl_ops.gl.p_glBindTexture(info.bind_target, texture);
|
||||
if (gl_info->supported[ARB_SHADOW])
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glGetTexParameteriv(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, &compare_mode);
|
||||
if (compare_mode != GL_NONE)
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
|
||||
}
|
||||
|
||||
device->shader_backend->shader_select_depth_blt(device->shader_priv,
|
||||
gl_info, info.tex_type, &surface->ds_current_size);
|
||||
|
||||
gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
|
||||
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[0].x);
|
||||
gl_info->gl_ops.gl.p_glVertex2f(-1.0f, -1.0f);
|
||||
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[1].x);
|
||||
gl_info->gl_ops.gl.p_glVertex2f(1.0f, -1.0f);
|
||||
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[2].x);
|
||||
gl_info->gl_ops.gl.p_glVertex2f(-1.0f, 1.0f);
|
||||
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[3].x);
|
||||
gl_info->gl_ops.gl.p_glVertex2f(1.0f, 1.0f);
|
||||
gl_info->gl_ops.gl.p_glEnd();
|
||||
|
||||
if (compare_mode != GL_NONE)
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, compare_mode);
|
||||
gl_info->gl_ops.gl.p_glBindTexture(info.bind_target, old_binding);
|
||||
|
||||
gl_info->gl_ops.gl.p_glPopAttrib();
|
||||
|
||||
device->shader_backend->shader_deselect_depth_blt(device->shader_priv, gl_info);
|
||||
}
|
||||
|
||||
void surface_modify_ds_location(struct wined3d_surface *surface,
|
||||
DWORD location, UINT w, UINT h)
|
||||
{
|
||||
|
@ -2566,125 +2504,6 @@ void surface_modify_ds_location(struct wined3d_surface *surface,
|
|||
wined3d_texture_invalidate_location(texture, sub_resource_idx, ~location);
|
||||
}
|
||||
|
||||
/* Context activation is done by the caller. */
|
||||
static void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_context *context, DWORD location)
|
||||
{
|
||||
unsigned int sub_resource_idx = surface_get_sub_resource_idx(surface);
|
||||
struct wined3d_texture *texture = surface->container;
|
||||
struct wined3d_device *device = texture->resource.device;
|
||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||
GLsizei w, h;
|
||||
|
||||
TRACE("surface %p, context %p, new location %#x.\n", surface, context, location);
|
||||
|
||||
/* TODO: Make this work for modes other than FBO */
|
||||
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return;
|
||||
|
||||
if (!(texture->sub_resources[sub_resource_idx].locations & location))
|
||||
{
|
||||
w = surface->ds_current_size.cx;
|
||||
h = surface->ds_current_size.cy;
|
||||
surface->ds_current_size.cx = 0;
|
||||
surface->ds_current_size.cy = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
w = wined3d_texture_get_level_width(texture, surface->texture_level);
|
||||
h = wined3d_texture_get_level_height(texture, surface->texture_level);
|
||||
}
|
||||
|
||||
if (surface->current_renderbuffer)
|
||||
{
|
||||
FIXME("Not supported with fixed up depth stencil.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
wined3d_texture_prepare_location(texture, sub_resource_idx, context, location);
|
||||
|
||||
if (location == WINED3D_LOCATION_TEXTURE_RGB)
|
||||
{
|
||||
GLint old_binding = 0;
|
||||
GLenum bind_target;
|
||||
|
||||
/* The render target is allowed to be smaller than the depth/stencil
|
||||
* buffer, so the onscreen depth/stencil buffer is potentially smaller
|
||||
* than the offscreen surface. Don't overwrite the offscreen surface
|
||||
* with undefined data. */
|
||||
w = min(w, context->swapchain->desc.backbuffer_width);
|
||||
h = min(h, context->swapchain->desc.backbuffer_height);
|
||||
|
||||
TRACE("Copying onscreen depth buffer to depth texture.\n");
|
||||
|
||||
if (!device->depth_blt_texture)
|
||||
gl_info->gl_ops.gl.p_glGenTextures(1, &device->depth_blt_texture);
|
||||
|
||||
/* Note that we use depth_blt here as well, rather than glCopyTexImage2D
|
||||
* directly on the FBO texture. That's because we need to flip. */
|
||||
context_apply_fbo_state_blit(context, GL_FRAMEBUFFER,
|
||||
context->swapchain->front_buffer->sub_resources[0].u.surface,
|
||||
NULL, WINED3D_LOCATION_DRAWABLE);
|
||||
if (surface->texture_target == GL_TEXTURE_RECTANGLE_ARB)
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
|
||||
bind_target = GL_TEXTURE_RECTANGLE_ARB;
|
||||
}
|
||||
else
|
||||
{
|
||||
gl_info->gl_ops.gl.p_glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
|
||||
bind_target = GL_TEXTURE_2D;
|
||||
}
|
||||
gl_info->gl_ops.gl.p_glBindTexture(bind_target, device->depth_blt_texture);
|
||||
/* We use GL_DEPTH_COMPONENT instead of the surface's specific
|
||||
* internal format, because the internal format might include stencil
|
||||
* data. In principle we should copy stencil data as well, but unless
|
||||
* the driver supports stencil export it's hard to do, and doesn't
|
||||
* seem to be needed in practice. If the hardware doesn't support
|
||||
* writing stencil data, the glCopyTexImage2D() call might trigger
|
||||
* software fallbacks. */
|
||||
gl_info->gl_ops.gl.p_glCopyTexImage2D(bind_target, 0, GL_DEPTH_COMPONENT, 0, 0, w, h, 0);
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
gl_info->gl_ops.gl.p_glTexParameteri(bind_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||
gl_info->gl_ops.gl.p_glBindTexture(bind_target, old_binding);
|
||||
|
||||
context_apply_fbo_state_blit(context, GL_FRAMEBUFFER,
|
||||
NULL, surface, WINED3D_LOCATION_TEXTURE_RGB);
|
||||
context_set_draw_buffer(context, GL_NONE);
|
||||
|
||||
/* Do the actual blit */
|
||||
surface_depth_blt(surface, context, device->depth_blt_texture, 0, 0, w, h, bind_target);
|
||||
checkGLcall("depth_blt");
|
||||
|
||||
context_invalidate_state(context, STATE_FRAMEBUFFER);
|
||||
|
||||
if (wined3d_settings.strict_draw_ordering)
|
||||
gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */
|
||||
}
|
||||
else if (location == WINED3D_LOCATION_DRAWABLE)
|
||||
{
|
||||
TRACE("Copying depth texture to onscreen depth buffer.\n");
|
||||
|
||||
context_apply_fbo_state_blit(context, GL_FRAMEBUFFER,
|
||||
context->swapchain->front_buffer->sub_resources[0].u.surface,
|
||||
NULL, WINED3D_LOCATION_DRAWABLE);
|
||||
surface_depth_blt(surface, context, texture->texture_rgb.name, 0,
|
||||
wined3d_texture_get_level_pow2_height(texture, surface->texture_level) - h,
|
||||
w, h, surface->texture_target);
|
||||
checkGLcall("depth_blt");
|
||||
|
||||
context_invalidate_state(context, STATE_FRAMEBUFFER);
|
||||
|
||||
if (wined3d_settings.strict_draw_ordering)
|
||||
gl_info->gl_ops.gl.p_glFlush(); /* Flush to ensure ordering across contexts. */
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("Invalid location (%#x) specified.\n", location);
|
||||
}
|
||||
}
|
||||
|
||||
static DWORD resource_access_from_location(DWORD location)
|
||||
{
|
||||
switch (location)
|
||||
|
@ -3050,13 +2869,6 @@ HRESULT surface_load_location(struct wined3d_surface *surface, struct wined3d_co
|
|||
|
||||
if (texture->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
|
||||
{
|
||||
if ((location == WINED3D_LOCATION_TEXTURE_RGB && sub_resource->locations & WINED3D_LOCATION_DRAWABLE)
|
||||
|| (location == WINED3D_LOCATION_DRAWABLE && sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB))
|
||||
{
|
||||
surface_load_ds_location(surface, context, location);
|
||||
goto done;
|
||||
}
|
||||
|
||||
FIXME("Unimplemented copy from %s to %s for depth/stencil buffers.\n",
|
||||
wined3d_debug_location(sub_resource->locations), wined3d_debug_location(location));
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
|
|
|
@ -1202,9 +1202,6 @@ struct wined3d_shader_backend_ops
|
|||
void (*shader_select)(void *shader_priv, struct wined3d_context *context,
|
||||
const struct wined3d_state *state);
|
||||
void (*shader_disable)(void *shader_priv, struct wined3d_context *context);
|
||||
void (*shader_select_depth_blt)(void *shader_priv, const struct wined3d_gl_info *gl_info,
|
||||
enum wined3d_gl_resource_type tex_type, const SIZE *ds_mask_size);
|
||||
void (*shader_deselect_depth_blt)(void *shader_priv, const struct wined3d_gl_info *gl_info);
|
||||
void (*shader_update_float_vertex_constants)(struct wined3d_device *device, UINT start, UINT count);
|
||||
void (*shader_update_float_pixel_constants)(struct wined3d_device *device, UINT start, UINT count);
|
||||
void (*shader_load_constants)(void *shader_priv, struct wined3d_context *context,
|
||||
|
|
Loading…
Reference in New Issue