From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/target-helpers/drm_helper.h | 8 ++++---- src/gallium/drivers/r300/r300_public.h | 2 +- src/gallium/drivers/r300/r300_screen.c | 2 +- src/gallium/drivers/r600/r600_pipe.c | 4 ++-- src/gallium/drivers/r600/r600_public.h | 2 +- src/gallium/drivers/radeon/r600_pipe_common.c | 2 +- src/gallium/drivers/radeon/r600_pipe_common.h | 2 +- src/gallium/drivers/radeonsi/si_pipe.c | 5 +++-- src/gallium/drivers/radeonsi/si_public.h | 3 ++- src/gallium/targets/pipe-loader/pipe_r300.c | 2 +- src/gallium/targets/pipe-loader/pipe_r600.c | 2 +- src/gallium/targets/pipe-loader/pipe_radeonsi.c | 4 ++-- src/gallium/winsys/amdgpu/drm/amdgpu_public.h | 6 ++++-- src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 5 +++-- src/gallium/winsys/radeon/drm/radeon_drm_public.h | 6 ++++-- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 5 +++-- 16 files changed, 34 insertions(+), 26 deletions(-)
diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h index 65231cf..0027ede 100644 --- a/src/gallium/auxiliary/target-helpers/drm_helper.h +++ b/src/gallium/auxiliary/target-helpers/drm_helper.h @@ -83,21 +83,21 @@ pipe_pl111_create_screen(int fd, unsigned flags) #ifdef GALLIUM_R300 #include "radeon/radeon_winsys.h" #include "radeon/drm/radeon_drm_public.h" #include "r300/r300_public.h" struct pipe_screen * pipe_r300_create_screen(int fd, unsigned flags) { struct radeon_winsys *rw; - rw = radeon_drm_winsys_create(fd, r300_screen_create); + rw = radeon_drm_winsys_create(fd, flags, r300_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } #else struct pipe_screen * pipe_r300_create_screen(int fd, unsigned flags) { fprintf(stderr, "r300: driver missing\n"); return NULL; @@ -108,21 +108,21 @@ pipe_r300_create_screen(int fd, unsigned flags) #ifdef GALLIUM_R600 #include "radeon/radeon_winsys.h" #include "radeon/drm/radeon_drm_public.h" #include "r600/r600_public.h" struct pipe_screen * pipe_r600_create_screen(int fd, unsigned flags) { struct radeon_winsys *rw; - rw = radeon_drm_winsys_create(fd, r600_screen_create); + rw = radeon_drm_winsys_create(fd, flags, r600_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } #else struct pipe_screen * pipe_r600_create_screen(int fd, unsigned flags) { fprintf(stderr, "r600: driver missing\n"); return NULL; @@ -135,24 +135,24 @@ pipe_r600_create_screen(int fd, unsigned flags) #include "radeon/drm/radeon_drm_public.h" #include "amdgpu/drm/amdgpu_public.h" #include "radeonsi/si_public.h" struct pipe_screen * pipe_radeonsi_create_screen(int fd, unsigned flags) { struct radeon_winsys *rw; /* First, try amdgpu. */ - rw = amdgpu_winsys_create(fd, radeonsi_screen_create); + rw = amdgpu_winsys_create(fd, flags, radeonsi_screen_create); if (!rw) - rw = radeon_drm_winsys_create(fd, radeonsi_screen_create); + rw = radeon_drm_winsys_create(fd, flags, radeonsi_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } #else struct pipe_screen * pipe_radeonsi_create_screen(int fd, unsigned flags) { fprintf(stderr, "radeonsi: driver missing\n"); diff --git a/src/gallium/drivers/r300/r300_public.h b/src/gallium/drivers/r300/r300_public.h index 57a69cb..d230010 100644 --- a/src/gallium/drivers/r300/r300_public.h +++ b/src/gallium/drivers/r300/r300_public.h @@ -1,17 +1,17 @@ #ifndef R300_PUBLIC_H #define R300_PUBLIC_H #ifdef __cplusplus extern "C" { #endif struct radeon_winsys; -struct pipe_screen* r300_screen_create(struct radeon_winsys *rws); +struct pipe_screen* r300_screen_create(struct radeon_winsys *rws, unsigned flags); #ifdef __cplusplus } // extern "C" #endif #endif diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index 937f9ae..5cdb248 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -717,21 +717,21 @@ static void r300_fence_reference(struct pipe_screen *screen, static boolean r300_fence_finish(struct pipe_screen *screen, struct pipe_context *ctx, struct pipe_fence_handle *fence, uint64_t timeout) { struct radeon_winsys *rws = r300_screen(screen)->rws; return rws->fence_wait(rws, fence, timeout); } -struct pipe_screen* r300_screen_create(struct radeon_winsys *rws) +struct pipe_screen* r300_screen_create(struct radeon_winsys *rws, unsigned flags) { struct r300_screen *r300screen = CALLOC_STRUCT(r300_screen); if (!r300screen) { FREE(r300screen); return NULL; } rws->query_info(rws, &r300screen->info); diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index a225f41..f0ea409 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -625,36 +625,36 @@ static void r600_destroy_screen(struct pipe_screen* pscreen) static struct pipe_resource *r600_resource_create(struct pipe_screen *screen, const struct pipe_resource *templ) { if (templ->target == PIPE_BUFFER && (templ->bind & PIPE_BIND_GLOBAL)) return r600_compute_global_buffer_create(screen, templ); return r600_resource_create_common(screen, templ); } -struct pipe_screen *r600_screen_create(struct radeon_winsys *ws) +struct pipe_screen *r600_screen_create(struct radeon_winsys *ws, unsigned flags) { struct r600_screen *rscreen = CALLOC_STRUCT(r600_screen); if (!rscreen) { return NULL; } /* Set functions first. */ rscreen->b.b.context_create = r600_create_context; rscreen->b.b.destroy = r600_destroy_screen; rscreen->b.b.get_param = r600_get_param; rscreen->b.b.get_shader_param = r600_get_shader_param; rscreen->b.b.resource_create = r600_resource_create; - if (!r600_common_screen_init(&rscreen->b, ws)) { + if (!r600_common_screen_init(&rscreen->b, ws, flags)) { FREE(rscreen); return NULL; } if (rscreen->b.info.chip_class >= EVERGREEN) { rscreen->b.b.is_format_supported = evergreen_is_format_supported; } else { rscreen->b.b.is_format_supported = r600_is_format_supported; } diff --git a/src/gallium/drivers/r600/r600_public.h b/src/gallium/drivers/r600/r600_public.h index e4fe23a..2018440 100644 --- a/src/gallium/drivers/r600/r600_public.h +++ b/src/gallium/drivers/r600/r600_public.h @@ -18,13 +18,13 @@ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef R600_PUBLIC_H #define R600_PUBLIC_H struct radeon_winsys; -struct pipe_screen *r600_screen_create(struct radeon_winsys *ws); +struct pipe_screen *r600_screen_create(struct radeon_winsys *ws, unsigned flags); #endif diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 1cec6d5..04f7fc1 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -1315,21 +1315,21 @@ struct pipe_resource *r600_resource_create_common(struct pipe_screen *screen, const struct pipe_resource *templ) { if (templ->target == PIPE_BUFFER) { return r600_buffer_create(screen, templ, 256); } else { return r600_texture_create(screen, templ); } } bool r600_common_screen_init(struct r600_common_screen *rscreen, - struct radeon_winsys *ws) + struct radeon_winsys *ws, unsigned flags) { char family_name[32] = {}, llvm_string[32] = {}, kernel_version[128] = {}; struct utsname uname_data; const char *chip_name; ws->query_info(ws, &rscreen->info); rscreen->ws = ws; if ((chip_name = r600_get_marketing_name(ws))) snprintf(family_name, sizeof(family_name), "%s / ", r600_get_family_name(rscreen)); diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h index 310fb57..e67982a 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.h +++ b/src/gallium/drivers/radeon/r600_pipe_common.h @@ -738,21 +738,21 @@ void r600_gfx_write_event_eop(struct r600_common_context *ctx, struct r600_resource *buf, uint64_t va, uint32_t old_fence, uint32_t new_fence); unsigned r600_gfx_write_fence_dwords(struct r600_common_screen *screen); void r600_gfx_wait_fence(struct r600_common_context *ctx, uint64_t va, uint32_t ref, uint32_t mask); void r600_draw_rectangle(struct blitter_context *blitter, int x1, int y1, int x2, int y2, float depth, enum blitter_attrib_type type, const union pipe_color_union *attrib); bool r600_common_screen_init(struct r600_common_screen *rscreen, - struct radeon_winsys *ws); + struct radeon_winsys *ws, unsigned flags); void r600_destroy_common_screen(struct r600_common_screen *rscreen); void r600_preflush_suspend_features(struct r600_common_context *ctx); void r600_postflush_resume_features(struct r600_common_context *ctx); bool r600_common_context_init(struct r600_common_context *rctx, struct r600_common_screen *rscreen, unsigned context_flags); void r600_common_context_cleanup(struct r600_common_context *rctx); bool r600_can_dump_shader(struct r600_common_screen *rscreen, unsigned processor); bool r600_extra_shader_checks(struct r600_common_screen *rscreen, diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 74ac0ec..ff787ad 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -909,39 +909,40 @@ static void si_test_vmfault(struct si_screen *sscreen) ctx->flush(ctx, NULL, 0); puts("VM fault test: SDMA - done."); } if (sscreen->b.debug_flags & DBG_TEST_VMFAULT_SHADER) { util_test_constant_buffer(ctx, buf); puts("VM fault test: Shader - done."); } exit(0); } -struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) +struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws, + unsigned flags) { struct si_screen *sscreen = CALLOC_STRUCT(si_screen); unsigned num_threads, num_compiler_threads, num_compiler_threads_lowprio, i; if (!sscreen) { return NULL; } /* Set functions first. */ sscreen->b.b.context_create = si_pipe_create_context; sscreen->b.b.destroy = si_destroy_screen; sscreen->b.b.get_param = si_get_param; sscreen->b.b.get_shader_param = si_get_shader_param; sscreen->b.b.resource_create = r600_resource_create_common; si_init_screen_state_functions(sscreen); - if (!r600_common_screen_init(&sscreen->b, ws) || + if (!r600_common_screen_init(&sscreen->b, ws, flags) || !si_init_gs_info(sscreen) || !si_init_shader_cache(sscreen)) { FREE(sscreen); return NULL; } /* Only enable as many threads as we have target machines, but at most * the number of CPUs - 1 if there is more than one. */ num_threads = sysconf(_SC_NPROCESSORS_ONLN); diff --git a/src/gallium/drivers/radeonsi/si_public.h b/src/gallium/drivers/radeonsi/si_public.h index 7cf36c8..13b1731 100644 --- a/src/gallium/drivers/radeonsi/si_public.h +++ b/src/gallium/drivers/radeonsi/si_public.h @@ -18,13 +18,14 @@ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef SI_PUBLIC_H #define SI_PUBLIC_H struct radeon_winsys; -struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws); +struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws, + unsigned flags); #endif diff --git a/src/gallium/targets/pipe-loader/pipe_r300.c b/src/gallium/targets/pipe-loader/pipe_r300.c index ffd6ba8..da72859 100644 --- a/src/gallium/targets/pipe-loader/pipe_r300.c +++ b/src/gallium/targets/pipe-loader/pipe_r300.c @@ -2,21 +2,21 @@ #include "state_tracker/drm_driver.h" #include "radeon/drm/radeon_drm_public.h" #include "radeon/radeon_winsys.h" #include "r300/r300_public.h" static struct pipe_screen * create_screen(int fd, unsigned flags) { struct radeon_winsys *sws; - sws = radeon_drm_winsys_create(fd, r300_screen_create); + sws = radeon_drm_winsys_create(fd, flags, r300_screen_create); return sws ? debug_screen_wrap(sws->screen) : NULL; } static const struct drm_conf_ret throttle_ret = { .type = DRM_CONF_INT, .val.val_int = 2, }; static const struct drm_conf_ret share_fd_ret = { .type = DRM_CONF_BOOL, diff --git a/src/gallium/targets/pipe-loader/pipe_r600.c b/src/gallium/targets/pipe-loader/pipe_r600.c index 6f21c50..dfe130a 100644 --- a/src/gallium/targets/pipe-loader/pipe_r600.c +++ b/src/gallium/targets/pipe-loader/pipe_r600.c @@ -2,21 +2,21 @@ #include "target-helpers/inline_debug_helper.h" #include "radeon/drm/radeon_drm_public.h" #include "radeon/radeon_winsys.h" #include "r600/r600_public.h" static struct pipe_screen * create_screen(int fd, unsigned flags) { struct radeon_winsys *rw; - rw = radeon_drm_winsys_create(fd, r600_screen_create); + rw = radeon_drm_winsys_create(fd, flags, r600_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } static const struct drm_conf_ret throttle_ret = { .type = DRM_CONF_INT, .val.val_int = 2, }; static const struct drm_conf_ret share_fd_ret = { .type = DRM_CONF_BOOL, diff --git a/src/gallium/targets/pipe-loader/pipe_radeonsi.c b/src/gallium/targets/pipe-loader/pipe_radeonsi.c index b6a78e4..1bbd97f 100644 --- a/src/gallium/targets/pipe-loader/pipe_radeonsi.c +++ b/src/gallium/targets/pipe-loader/pipe_radeonsi.c @@ -4,24 +4,24 @@ #include "radeon/radeon_winsys.h" #include "amdgpu/drm/amdgpu_public.h" #include "radeonsi/si_public.h" static struct pipe_screen * create_screen(int fd, unsigned flags) { struct radeon_winsys *rw; /* First, try amdgpu. */ - rw = amdgpu_winsys_create(fd, radeonsi_screen_create); + rw = amdgpu_winsys_create(fd, flags, radeonsi_screen_create); if (!rw) - rw = radeon_drm_winsys_create(fd, radeonsi_screen_create); + rw = radeon_drm_winsys_create(fd, flags, radeonsi_screen_create); return rw ? debug_screen_wrap(rw->screen) : NULL; } static const struct drm_conf_ret throttle_ret = { .type = DRM_CONF_INT, .val.val_int = 2, }; static const struct drm_conf_ret share_fd_ret = { diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_public.h b/src/gallium/winsys/amdgpu/drm/amdgpu_public.h index ad133b2..3cb5a1b 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_public.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_public.h @@ -25,16 +25,18 @@ */ #ifndef AMDGPU_PUBLIC_H #define AMDGPU_PUBLIC_H #include "pipe/p_defines.h" struct radeon_winsys; struct pipe_screen; -typedef struct pipe_screen *(*radeon_screen_create_t)(struct radeon_winsys *); +typedef struct pipe_screen *(*radeon_screen_create_t)(struct radeon_winsys *, + unsigned); struct radeon_winsys * -amdgpu_winsys_create(int fd, radeon_screen_create_t screen_create); +amdgpu_winsys_create(int fd, unsigned flags, + radeon_screen_create_t screen_create); #endif diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index 2cbc39c..c4d5216 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -222,21 +222,22 @@ static bool amdgpu_winsys_unref(struct radeon_winsys *rws) } static const char* amdgpu_get_chip_name(struct radeon_winsys *ws) { amdgpu_device_handle dev = ((struct amdgpu_winsys *)ws)->dev; return amdgpu_get_marketing_name(dev); } PUBLIC struct radeon_winsys * -amdgpu_winsys_create(int fd, radeon_screen_create_t screen_create) +amdgpu_winsys_create(int fd, unsigned flags, + radeon_screen_create_t screen_create) { struct amdgpu_winsys *ws; drmVersionPtr version = drmGetVersion(fd); amdgpu_device_handle dev; uint32_t drm_major, drm_minor, r; /* The DRM driver version of amdgpu is 3.x.x. */ if (version->version_major != 3) { drmFreeVersion(version); return NULL; @@ -317,21 +318,21 @@ amdgpu_winsys_create(int fd, radeon_screen_create_t screen_create) amdgpu_winsys_destroy(&ws->base); mtx_unlock(&dev_tab_mutex); return NULL; } /* Create the screen at the end. The winsys must be initialized * completely. * * Alternatively, we could create the screen based on "ws->gen" * and link all drivers into one binary blob. */ - ws->base.screen = screen_create(&ws->base); + ws->base.screen = screen_create(&ws->base, flags); if (!ws->base.screen) { amdgpu_winsys_destroy(&ws->base); mtx_unlock(&dev_tab_mutex); return NULL; } util_hash_table_set(dev_tab, dev, ws); /* We must unlock the mutex once the winsys is fully initialized, so that * other threads attempting to create the winsys from the same fd will diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_public.h b/src/gallium/winsys/radeon/drm/radeon_drm_public.h index dfcaaa4..2192aa6 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_public.h +++ b/src/gallium/winsys/radeon/drm/radeon_drm_public.h @@ -1,14 +1,16 @@ #ifndef RADEON_DRM_PUBLIC_H #define RADEON_DRM_PUBLIC_H #include "pipe/p_defines.h" struct radeon_winsys; struct pipe_screen; -typedef struct pipe_screen *(*radeon_screen_create_t)(struct radeon_winsys *); +typedef struct pipe_screen *(*radeon_screen_create_t)(struct radeon_winsys *, + unsigned); struct radeon_winsys * -radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create); +radeon_drm_winsys_create(int fd, unsigned flags, + radeon_screen_create_t screen_create); #endif diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index e0d4cc8..2a6ce2c 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -728,21 +728,22 @@ static unsigned handle_hash(void *key) { return PTR_TO_UINT(key); } static int handle_compare(void *key1, void *key2) { return PTR_TO_UINT(key1) != PTR_TO_UINT(key2); } PUBLIC struct radeon_winsys * -radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create) +radeon_drm_winsys_create(int fd, unsigned flags, + radeon_screen_create_t screen_create) { struct radeon_drm_winsys *ws; mtx_lock(&fd_tab_mutex); if (!fd_tab) { fd_tab = util_hash_table_create(hash_fd, compare_fd); } ws = util_hash_table_get(fd_tab, intptr_to_pointer(fd)); if (ws) { @@ -823,21 +824,21 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create) ws->info.gart_page_size = sysconf(_SC_PAGESIZE); if (ws->num_cpus > 1 && debug_get_option_thread()) util_queue_init(&ws->cs_queue, "radeon_cs", 8, 1, 0); /* Create the screen at the end. The winsys must be initialized * completely. * * Alternatively, we could create the screen based on "ws->gen" * and link all drivers into one binary blob. */ - ws->base.screen = screen_create(&ws->base); + ws->base.screen = screen_create(&ws->base, flags); if (!ws->base.screen) { radeon_winsys_destroy(&ws->base); mtx_unlock(&fd_tab_mutex); return NULL; } util_hash_table_set(fd_tab, intptr_to_pointer(ws->fd), ws); /* We must unlock the mutex once the winsys is fully initialized, so that * other threads attempting to create the winsys from the same fd will -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev