radeon/winsys: keep screen pointer in winsys v2

Only create one screen for each winsys instance.
This helps with buffer sharing and interop handling.

v2: rebased and some minor cleanup

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Christian König 2013-09-25 13:59:56 +02:00
parent f6e2aa0e12
commit 4871128e58
8 changed files with 48 additions and 22 deletions

View file

@ -540,6 +540,9 @@ static void r300_destroy_screen(struct pipe_screen* pscreen)
struct r300_screen* r300screen = r300_screen(pscreen);
struct radeon_winsys *rws = radeon_winsys(pscreen);
if (rws && !radeon_winsys_unref(rws))
return;
pipe_mutex_destroy(r300screen->cmask_mutex);
if (rws)

View file

@ -958,6 +958,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)
if (rscreen == NULL)
return;
if (!radeon_winsys_unref(rscreen->b.ws))
return;
pipe_mutex_destroy(rscreen->aux_context_lock);
rscreen->aux_context->destroy(rscreen->aux_context);

View file

@ -648,6 +648,9 @@ static void r600_destroy_screen(struct pipe_screen* pscreen)
if (rscreen == NULL)
return;
if (!radeon_winsys_unref(rscreen->b.ws))
return;
if (rscreen->fences.bo) {
struct r600_fence_block *entry, *tmp;

View file

@ -28,25 +28,27 @@
#include "target-helpers/inline_debug_helper.h"
#include "state_tracker/drm_driver.h"
#include "radeon/drm/radeon_drm_public.h"
#include "radeon/drm/radeon_winsys.h"
#include "r300/r300_public.h"
static struct pipe_screen *
create_screen(int fd)
{
struct radeon_winsys *sws;
struct pipe_screen *screen;
sws = radeon_drm_winsys_create(fd);
if (!sws)
return NULL;
screen = r300_screen_create(sws);
if (!screen)
return NULL;
if (!sws->screen) {
sws->screen = r300_screen_create(sws);
if (!sws->screen)
return NULL;
screen = debug_screen_wrap(screen);
sws->screen = debug_screen_wrap(sws->screen);
}
return screen;
return sws->screen;
}
DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen, NULL)

View file

@ -28,24 +28,26 @@
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
#include "radeon/drm/radeon_drm_public.h"
#include "radeon/drm/radeon_winsys.h"
#include "r600/r600_public.h"
static struct pipe_screen *create_screen(int fd)
{
struct radeon_winsys *radeon;
struct pipe_screen *screen;
radeon = radeon_drm_winsys_create(fd);
if (!radeon)
return NULL;
screen = r600_screen_create(radeon);
if (!screen)
return NULL;
if (!radeon->screen) {
radeon->screen = r600_screen_create(radeon);
if (!radeon->screen)
return NULL;
screen = debug_screen_wrap(screen);
radeon->screen = debug_screen_wrap(radeon->screen);
}
return screen;
return radeon->screen;
}
static const struct drm_conf_ret throttle_ret = {

View file

@ -28,24 +28,26 @@
#include "state_tracker/drm_driver.h"
#include "target-helpers/inline_debug_helper.h"
#include "radeon/drm/radeon_drm_public.h"
#include "radeon/drm/radeon_winsys.h"
#include "radeonsi/radeonsi_public.h"
static struct pipe_screen *create_screen(int fd)
{
struct radeon_winsys *radeon;
struct pipe_screen *screen;
radeon = radeon_drm_winsys_create(fd);
if (!radeon)
return NULL;
screen = radeonsi_screen_create(radeon);
if (!screen)
return NULL;
if (!radeon->screen) {
radeon->screen = radeonsi_screen_create(radeon);
if (!radeon->screen)
return NULL;
screen = debug_screen_wrap(screen);
radeon->screen = debug_screen_wrap(radeon->screen);
}
return screen;
return radeon->screen;
}
static const struct drm_conf_ret throttle_ret = {

View file

@ -424,10 +424,6 @@ static void radeon_winsys_destroy(struct radeon_winsys *rws)
{
struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws;
if (!pipe_reference(&ws->base.reference, NULL)) {
return;
}
if (ws->thread) {
ws->kill_thread = 1;
pipe_semaphore_signal(&ws->cs_queued);

View file

@ -207,6 +207,11 @@ struct radeon_winsys {
*/
struct pipe_reference reference;
/**
* The screen object this winsys was created for
*/
struct pipe_screen *screen;
/**
* Destroy this winsys.
*
@ -501,6 +506,16 @@ struct radeon_winsys {
enum radeon_value_id value);
};
/**
* Decrement the winsys reference count.
*
* \param ws The winsys this function is called for.
*/
static INLINE boolean radeon_winsys_unref(struct radeon_winsys *ws)
{
return pipe_reference(&ws->reference, NULL);
}
static INLINE void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value)
{
cs->buf[cs->cdw++] = value;