static HRESULT WINAPI IWineD3DTextureImpl_AddDirtyRegion(IWineD3DBaseTexture *iface, UINT layer, const WINED3DBOX *dirty_region) { IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface; struct wined3d_resource *sub_resource; TRACE("iface %p, layer %u, dirty_region %p.\n", iface, layer, dirty_region); if (!(sub_resource = basetexture_get_sub_resource(texture, layer * texture->baseTexture.level_count))) { WARN("Failed to get sub-resource.\n"); return WINED3DERR_INVALIDCALL; } basetexture_set_dirty(texture, TRUE); surface_add_dirty_rect(surface_from_resource(sub_resource), dirty_region); return WINED3D_OK; }
void basetexture_unload(IWineD3DBaseTextureImpl *texture) { IWineD3DDeviceImpl *device = texture->resource.device; struct wined3d_context *context = NULL; if (texture->baseTexture.texture_rgb.name || texture->baseTexture.texture_srgb.name) { context = context_acquire(device, NULL); } if (texture->baseTexture.texture_rgb.name) gltexture_delete(&texture->baseTexture.texture_rgb); if (texture->baseTexture.texture_srgb.name) gltexture_delete(&texture->baseTexture.texture_srgb); if (context) context_release(context); basetexture_set_dirty(texture, TRUE); resource_unload(&texture->resource); }
/* Internal function, No d3d mapping */ static BOOL WINAPI IWineD3DVolumeTextureImpl_SetDirty(IWineD3DVolumeTexture *iface, BOOL dirty) { return basetexture_set_dirty((IWineD3DBaseTexture *)iface, dirty); }
/* Context activation is done by the caller. */ HRESULT basetexture_bind(IWineD3DBaseTextureImpl *texture, const struct wined3d_gl_info *gl_info, BOOL srgb, BOOL *set_surface_desc) { HRESULT hr = WINED3D_OK; GLenum textureDimensions; BOOL isNewTexture = FALSE; struct gl_texture *gl_tex; TRACE("texture %p, srgb %#x, set_surface_desc %p.\n", texture, srgb, set_surface_desc); texture->baseTexture.is_srgb = srgb; /* SRGB mode cache for PreLoad calls outside drawprim */ gl_tex = basetexture_get_gl_texture(texture, gl_info, srgb); textureDimensions = texture->baseTexture.target; ENTER_GL(); /* Generate a texture name if we don't already have one */ if (!gl_tex->name) { *set_surface_desc = TRUE; glGenTextures(1, &gl_tex->name); checkGLcall("glGenTextures"); TRACE("Generated texture %d\n", gl_tex->name); if (texture->resource.pool == WINED3DPOOL_DEFAULT) { /* Tell opengl to try and keep this texture in video ram (well mostly) */ GLclampf tmp; tmp = 0.9f; glPrioritizeTextures(1, &gl_tex->name, &tmp); } /* Initialise the state of the texture object to the openGL defaults, not the directx defaults */ gl_tex->states[WINED3DTEXSTA_ADDRESSU] = WINED3DTADDRESS_WRAP; gl_tex->states[WINED3DTEXSTA_ADDRESSV] = WINED3DTADDRESS_WRAP; gl_tex->states[WINED3DTEXSTA_ADDRESSW] = WINED3DTADDRESS_WRAP; gl_tex->states[WINED3DTEXSTA_BORDERCOLOR] = 0; gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_LINEAR; gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */ gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */ gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = 0; gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = 1; if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE]) gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = TRUE; else gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = srgb; gl_tex->states[WINED3DTEXSTA_SHADOW] = FALSE; basetexture_set_dirty(texture, TRUE); isNewTexture = TRUE; if (texture->resource.usage & WINED3DUSAGE_AUTOGENMIPMAP) { /* This means double binding the texture at creation, but keeps the code simpler all * in all, and the run-time path free from additional checks */ glBindTexture(textureDimensions, gl_tex->name); checkGLcall("glBindTexture"); glTexParameteri(textureDimensions, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); checkGLcall("glTexParameteri(textureDimensions, GL_GENERATE_MIPMAP_SGIS, GL_TRUE)"); } } else { *set_surface_desc = FALSE; } /* Bind the texture */ if (gl_tex->name) { glBindTexture(textureDimensions, gl_tex->name); checkGLcall("glBindTexture"); if (isNewTexture) { /* For a new texture we have to set the textures levels after binding the texture. * In theory this is all we should ever have to do, but because ATI's drivers are broken, we * also need to set the texture dimensions before the texture is set * Beware that texture rectangles do not support mipmapping, but set the maxmiplevel if we're * relying on the partial GL_ARB_texture_non_power_of_two emulation with texture rectangles * (ie, do not care for cond_np2 here, just look for GL_TEXTURE_RECTANGLE_ARB) */ if (textureDimensions != GL_TEXTURE_RECTANGLE_ARB) { TRACE("Setting GL_TEXTURE_MAX_LEVEL to %u.\n", texture->baseTexture.level_count - 1); glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, texture->baseTexture.level_count - 1); checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, texture->baseTexture.level_count)"); } if(textureDimensions==GL_TEXTURE_CUBE_MAP_ARB) { /* Cubemaps are always set to clamp, regardless of the sampler state. */ glTexParameteri(textureDimensions, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(textureDimensions, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(textureDimensions, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); } } } else { /* this only happened if we've run out of openGL textures */ WARN("This texture doesn't have an openGL texture assigned to it\n"); hr = WINED3DERR_INVALIDCALL; } LEAVE_GL(); return hr; }