static void wined3d_resource_destroy_object(void *object) { struct wined3d_resource *resource = object; wined3d_resource_free_sysmem(resource); context_resource_released(resource->device, resource, resource->type); wined3d_resource_release(resource); }
static void wined3d_shader_resource_view_cs_init(void *object) { struct wined3d_shader_resource_view *view = object; struct wined3d_resource *resource = view->resource; const struct wined3d_format *view_format; const struct wined3d_gl_info *gl_info; const struct wined3d_view_desc *desc; GLenum view_target; view_format = view->format; gl_info = &resource->device->adapter->gl_info; desc = &view->desc; if (resource->type == WINED3D_RTYPE_BUFFER) { struct wined3d_buffer *buffer = buffer_from_resource(resource); struct wined3d_context *context; context = context_acquire(resource->device, NULL, 0); create_buffer_view(&view->gl_view, context, desc, buffer, view_format); context_release(context); } else { struct wined3d_texture *texture = texture_from_resource(resource); view_target = get_texture_view_target(gl_info, desc, texture); if (resource->format->id == view_format->id && texture->target == view_target && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count && !is_stencil_view_format(view_format)) { TRACE("Creating identity shader resource view.\n"); } else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1) { FIXME("Swapchain shader resource views not supported.\n"); } else if (resource->format->typeless_id == view_format->typeless_id && resource->format->gl_view_class == view_format->gl_view_class) { create_texture_view(&view->gl_view, view_target, desc, texture, view_format); } else if (wined3d_format_is_depth_view(resource->format->id, view_format->id)) { create_texture_view(&view->gl_view, view_target, desc, texture, resource->format); } else { FIXME("Shader resource view not supported, resource format %s, view format %s.\n", debug_d3dformat(resource->format->id), debug_d3dformat(view_format->id)); } } wined3d_resource_release(resource); }
static void wined3d_unordered_access_view_cs_init(void *object) { struct wined3d_unordered_access_view *view = object; struct wined3d_resource *resource = view->resource; struct wined3d_view_desc *desc = &view->desc; const struct wined3d_gl_info *gl_info; gl_info = &resource->device->adapter->gl_info; if (resource->type == WINED3D_RTYPE_BUFFER) { struct wined3d_buffer *buffer = buffer_from_resource(resource); struct wined3d_context *context; context = context_acquire(resource->device, NULL, 0); gl_info = context->gl_info; create_buffer_view(&view->gl_view, context, desc, buffer, view->format); if (desc->flags & (WINED3D_VIEW_BUFFER_COUNTER | WINED3D_VIEW_BUFFER_APPEND)) { static const GLuint initial_value = 0; GL_EXTCALL(glGenBuffers(1, &view->counter_bo)); GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view->counter_bo)); GL_EXTCALL(glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(initial_value), &initial_value, GL_STATIC_DRAW)); checkGLcall("create atomic counter buffer"); } context_release(context); } else { struct wined3d_texture *texture = texture_from_resource(resource); unsigned int depth_or_layer_count; if (resource->type == WINED3D_RTYPE_TEXTURE_3D) depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx); else depth_or_layer_count = texture->layer_count; if (desc->u.texture.layer_idx || desc->u.texture.layer_count != depth_or_layer_count) { create_texture_view(&view->gl_view, get_texture_view_target(gl_info, desc, texture), desc, texture, view->format); } } wined3d_resource_release(resource); }