void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view, unsigned int unit, struct wined3d_sampler *sampler, struct wined3d_context *context) { const struct wined3d_gl_info *gl_info = context->gl_info; struct wined3d_texture *texture; context_active_texture(context, gl_info, unit); if (view->gl_view.name) { context_bind_texture(context, view->gl_view.target, view->gl_view.name); wined3d_sampler_bind(sampler, unit, NULL, context); return; } if (view->resource->type == WINED3D_RTYPE_BUFFER) { FIXME("Buffer shader resources not supported.\n"); return; } texture = wined3d_texture_from_resource(view->resource); wined3d_texture_bind(texture, context, FALSE); wined3d_sampler_bind(sampler, unit, texture, context); }
void * CDECL wined3d_rendertarget_view_get_sub_resource_parent(const struct wined3d_rendertarget_view *view) { struct wined3d_resource *sub_resource; TRACE("view %p.\n", view); if (view->resource->type == WINED3D_RTYPE_BUFFER) return wined3d_buffer_get_parent(buffer_from_resource(view->resource)); if (!(sub_resource = wined3d_texture_get_sub_resource(wined3d_texture_from_resource(view->resource), view->sub_resource_idx))) return NULL; return wined3d_resource_get_parent(sub_resource); }
/* Do not call while under the GL lock. */ static void texture3d_unload(struct wined3d_resource *resource) { struct wined3d_texture *texture = wined3d_texture_from_resource(resource); UINT i; TRACE("texture %p.\n", texture); for (i = 0; i < texture->level_count; ++i) { struct wined3d_resource *sub_resource = texture->sub_resources[i]; sub_resource->resource_ops->resource_unload(sub_resource); } wined3d_texture_unload(texture); }
BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) { struct wined3d_swapchain *swapchain; /* Only texture resources can be onscreen. */ if (resource->type != WINED3D_RTYPE_TEXTURE) return TRUE; /* Not on a swapchain - must be offscreen */ if (!(swapchain = wined3d_texture_from_resource(resource)->swapchain)) return TRUE; /* The front buffer is always onscreen */ if (resource == &swapchain->front_buffer->resource) return FALSE; /* If the swapchain is rendered to an FBO, the backbuffer is * offscreen, otherwise onscreen */ return swapchain->render_to_fbo; }
/* Do not call while under the GL lock. */ static void texture2d_unload(struct wined3d_resource *resource) { struct wined3d_texture *texture = wined3d_texture_from_resource(resource); UINT sub_count = texture->level_count * texture->layer_count; UINT i; TRACE("texture %p.\n", texture); for (i = 0; i < sub_count; ++i) { struct wined3d_resource *sub_resource = texture->sub_resources[i]; struct wined3d_surface *surface = surface_from_resource(sub_resource); sub_resource->resource_ops->resource_unload(sub_resource); surface_set_texture_name(surface, 0, FALSE); /* Delete RGB name */ surface_set_texture_name(surface, 0, TRUE); /* Delete sRGB name */ } wined3d_texture_unload(texture); }
void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view, struct wined3d_context *context) { struct wined3d_texture *texture; if (view->object) { context_bind_texture(context, view->target, view->object); return; } if (view->resource->type == WINED3D_RTYPE_BUFFER) { FIXME("Buffer shader resources not supported.\n"); return; } texture = wined3d_texture_from_resource(view->resource); wined3d_texture_bind(texture, context, FALSE); }
static void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view, const struct wined3d_rendertarget_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops) { const struct wined3d_gl_info *gl_info = &resource->device->adapter->gl_info; view->refcount = 1; view->resource = resource; wined3d_resource_incref(resource); view->parent = parent; view->parent_ops = parent_ops; view->format = wined3d_get_format(gl_info, desc->format_id); view->format_flags = view->format->flags[resource->gl_type]; if (resource->type == WINED3D_RTYPE_BUFFER) { view->sub_resource_idx = 0; view->buffer_offset = desc->u.buffer.start_idx; view->width = desc->u.buffer.count; view->height = 1; view->depth = 1; } else { struct wined3d_texture *texture = wined3d_texture_from_resource(resource); struct wined3d_resource *sub_resource; view->sub_resource_idx = desc->u.texture.layer_idx * texture->level_count + desc->u.texture.level_idx; sub_resource = wined3d_texture_get_sub_resource(texture, view->sub_resource_idx); view->buffer_offset = 0; view->width = sub_resource->width; view->height = sub_resource->height; view->depth = desc->u.texture.layer_count; } }
static ULONG texture_resource_decref(struct wined3d_resource *resource) { return wined3d_texture_decref(wined3d_texture_from_resource(resource)); }