From 5e5e0d469dbec12e9df5f167aea67e447ca6e3a5 Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Fri, 26 Oct 2018 22:52:46 -0700 Subject: [PATCH 1/7] Initial RGBA16F capabilities. --- src/gallium/drivers/vc4/kernel/vc4_validate.c | 4 +++- src/gallium/drivers/vc4/vc4_formats.c | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/vc4/kernel/vc4_validate.c b/src/gallium/drivers/vc4/kernel/vc4_validate.c index bd193b993b..f4155c9e0b 100644 --- a/src/gallium/drivers/vc4/kernel/vc4_validate.c +++ b/src/gallium/drivers/vc4/kernel/vc4_validate.c @@ -647,10 +647,12 @@ reloc_tex(struct vc4_exec_info *exec, width = (width + 3) >> 2; height = (height + 3) >> 2; break; + case VC4_TEXTURE_TYPE_RGBA64: + cpp = 8; + break; case VC4_TEXTURE_TYPE_BW1: case VC4_TEXTURE_TYPE_A4: case VC4_TEXTURE_TYPE_A1: - case VC4_TEXTURE_TYPE_RGBA64: case VC4_TEXTURE_TYPE_YUV422R: default: DRM_ERROR("Texture format %d unsupported\n", type); diff --git a/src/gallium/drivers/vc4/vc4_formats.c b/src/gallium/drivers/vc4/vc4_formats.c index 6d4a6249fb..b71f005942 100644 --- a/src/gallium/drivers/vc4/vc4_formats.c +++ b/src/gallium/drivers/vc4/vc4_formats.c @@ -40,6 +40,7 @@ #define RT_NO 0 #define RT_RGBA8888 1 #define RT_RGB565 2 +#define RT_RGBA16F 3 // Use RGBA64 to keep valid? struct vc4_format { /** Set if the pipe format is defined in the table. */ @@ -104,6 +105,8 @@ static const struct vc4_format vc4_format_table[] = { FORMAT(L8A8_UNORM, NO, LUMALPHA, SWIZ(X, X, X, W)), FORMAT(R8G8_UNORM, NO, LUMALPHA, SWIZ(X, W, 0, 1)), + + FORMAT(R16G16B16A16_FLOAT, RGBA16F, RGBA64, SWIZ(X, Y, Z, W)), }; static const struct vc4_format * From 2f2ad22fdb8507817f91d02179a46a8f447f4ac9 Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Mon, 5 Nov 2018 14:24:23 -0800 Subject: [PATCH 2/7] Save --- src/gallium/drivers/vc4/vc4_formats.c | 7 +++++-- src/gallium/drivers/vc4/vc4_program.c | 22 ++++++++++++++++++++++ src/gallium/drivers/vc4/vc4_qir.h | 4 ++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/vc4/vc4_formats.c b/src/gallium/drivers/vc4/vc4_formats.c index b71f005942..cb971994aa 100644 --- a/src/gallium/drivers/vc4/vc4_formats.c +++ b/src/gallium/drivers/vc4/vc4_formats.c @@ -40,13 +40,13 @@ #define RT_NO 0 #define RT_RGBA8888 1 #define RT_RGB565 2 -#define RT_RGBA16F 3 // Use RGBA64 to keep valid? +#define RT_RGBA16F 3 struct vc4_format { /** Set if the pipe format is defined in the table. */ bool present; - /** Set to 0 if unsupported, 1 if RGBA8888, 2 if rgb565. */ + /** Set to 0 if unsupported, 1 if RGBA8888, 2 if rgb565, 3 if RGBA16F */ uint8_t rt_type; /** One of VC4_TEXTURE_TYPE_*. */ @@ -59,6 +59,9 @@ struct vc4_format { * value into shader rgba values. */ uint8_t swizzle[4]; + + /* Whether the return value is 16F/I/UI or 32F/I/UI. */ + uint8_t return_size; }; #define SWIZ(x,y,z,w) { \ diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 13c3b7678b..44ed63284d 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -939,6 +939,15 @@ ntq_emit_pack_unorm_4x8(struct vc4_compile *c, nir_alu_instr *instr) ntq_store_dest(c, &instr->dest.dest, 0, qir_MOV(c, result)); } +/** + * TODO(kreeger): Document me. + */ +static void +ntq_emit_pack_half_2x16(struct vc4_compile *c, nir_alu_instr *instr) +{ + // TODO(kreeger): Write me +} + /** Handles sign-extended bitfield extracts for 16 bits. */ static struct qreg ntq_emit_ibfe(struct vc4_compile *c, struct qreg base, struct qreg offset, @@ -1142,6 +1151,11 @@ ntq_emit_alu(struct vc4_compile *c, nir_alu_instr *instr) return; } + if (instr->op == nir_op_pack_half_2x16) { + ntq_emit_pack_half_2x16(c, instr); + return; + } + if (instr->op == nir_op_unpack_unorm_4x8) { struct qreg src = ntq_get_src(c, instr->src[0].src, instr->src[0].swizzle[0]); @@ -1153,6 +1167,12 @@ ntq_emit_alu(struct vc4_compile *c, nir_alu_instr *instr) return; } + if (instr->op == nir_op_unpack_half_2x16) { + // + // TODO(kreeger): Write me. + // + } + /* General case: We can just grab the one used channel per src. */ struct qreg src[nir_op_infos[instr->op].num_inputs]; for (int i = 0; i < nir_op_infos[instr->op].num_inputs; i++) { @@ -2722,6 +2742,8 @@ vc4_setup_shared_key(struct vc4_context *vc4, struct vc4_key *key, if (!sampler) continue; + // TODO(kreeger): Assign "is_float_texture" here. + key->tex[i].format = sampler->format; key->tex[i].swizzle[0] = sampler->swizzle_r; key->tex[i].swizzle[1] = sampler->swizzle_g; diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h index 3afa98a66a..caf3239c1a 100644 --- a/src/gallium/drivers/vc4/vc4_qir.h +++ b/src/gallium/drivers/vc4/vc4_qir.h @@ -329,6 +329,8 @@ struct vc4_key { struct { enum pipe_format format; uint8_t swizzle[4]; + // TODO(kreeger): Add 'is_float_texture' here? + uint8_t return_size; union { struct { unsigned compare_mode:1; @@ -352,6 +354,7 @@ struct vc4_fs_key { bool stencil_enabled; bool stencil_twoside; bool stencil_full_writemasks; + bool is_float_render_target; // TODO(kreeger): Use this. bool is_points; bool is_lines; bool point_coord_upper_left; @@ -360,6 +363,7 @@ struct vc4_fs_key { bool sample_coverage; bool sample_alpha_to_coverage; bool sample_alpha_to_one; + // TODO(kreeger): Add 'is_float_render_target' here. uint8_t alpha_test_func; uint8_t logicop_func; uint32_t point_sprite_mask; From f973d363bec7bf4b157962e94596e5ad2f5fd693 Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Mon, 5 Nov 2018 14:29:42 -0800 Subject: [PATCH 3/7] Format support for screen. --- src/gallium/drivers/vc4/vc4_screen.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index 17776fa4d9..4d7da374ea 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -504,6 +504,7 @@ vc4_screen_is_format_supported(struct pipe_screen *pscreen, case PIPE_FORMAT_R32G32B32_SSCALED: case PIPE_FORMAT_R32G32_SSCALED: case PIPE_FORMAT_R32_SSCALED: + case PIPE_FORMAT_R16G16B16A16_FLOAT: case PIPE_FORMAT_R16G16B16A16_UNORM: case PIPE_FORMAT_R16G16B16_UNORM: case PIPE_FORMAT_R16G16_UNORM: From 8838a6a49966f28b0a9ecd3f15c4d9ef53d6d1cb Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Mon, 5 Nov 2018 14:34:32 -0800 Subject: [PATCH 4/7] Cleanup --- src/gallium/drivers/vc4/vc4_qir.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h index caf3239c1a..483c24ad1e 100644 --- a/src/gallium/drivers/vc4/vc4_qir.h +++ b/src/gallium/drivers/vc4/vc4_qir.h @@ -363,7 +363,6 @@ struct vc4_fs_key { bool sample_coverage; bool sample_alpha_to_coverage; bool sample_alpha_to_one; - // TODO(kreeger): Add 'is_float_render_target' here. uint8_t alpha_test_func; uint8_t logicop_func; uint32_t point_sprite_mask; From 8a86c304b2e271620ceb16bc0e72811e180129e0 Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Mon, 5 Nov 2018 15:00:46 -0800 Subject: [PATCH 5/7] Add unpack parts. --- src/gallium/drivers/vc4/vc4_program.c | 7 ++++++- src/gallium/drivers/vc4/vc4_qir.h | 3 +-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 44ed63284d..a5b4ab8462 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -617,7 +617,12 @@ ntq_emit_tex(struct vc4_compile *c, nir_tex_instr *instr) dest[i] = depth_output; } else { for (int i = 0; i < 4; i++) - dest[i] = qir_UNPACK_8_F(c, tex, i); + if (c->key->tex[unit].format == PIPE_FORMAT_R16G16B16A16_FLOAT) { + // TODO(kreeger) - unpack 8 or 16 as needed! + /* dest[i] = qir_UNPACK_8_F(c, tex, i); */ + } else { + dest[i] = qir_UNPACK_8_F(c, tex, i); + } } } diff --git a/src/gallium/drivers/vc4/vc4_qir.h b/src/gallium/drivers/vc4/vc4_qir.h index 483c24ad1e..49c58eafb1 100644 --- a/src/gallium/drivers/vc4/vc4_qir.h +++ b/src/gallium/drivers/vc4/vc4_qir.h @@ -329,8 +329,7 @@ struct vc4_key { struct { enum pipe_format format; uint8_t swizzle[4]; - // TODO(kreeger): Add 'is_float_texture' here? - uint8_t return_size; + uint8_t return_size; // Needed? union { struct { unsigned compare_mode:1; From 53a1210b9da7ae24645a2abbc9e09d1f36613f7b Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Fri, 16 Nov 2018 10:31:10 -0800 Subject: [PATCH 6/7] log --- src/egl/drivers/dri2/platform_drm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 35bc4b5b1a..070e7c1d8b 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -740,6 +740,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) dri2_dpy->gbm_dri = gbm_dri_device(gbm); dri2_dpy->driver_name = strdup(dri2_dpy->gbm_dri->driver_name); + fprintf(stderr, "$$$ DRIVER_NAME: %s\n", dri2_dpy->gbm_dri->driver_name); dri2_dpy->dri_screen = dri2_dpy->gbm_dri->screen; dri2_dpy->core = dri2_dpy->gbm_dri->core; From 478ea4b998ac9141aa8a6120637fa9e9a27fa608 Mon Sep 17 00:00:00 2001 From: Nick Kreeger Date: Fri, 16 Nov 2018 15:44:17 -0800 Subject: [PATCH 7/7] save logging. --- src/egl/drivers/dri2/platform_drm.c | 1 + src/glx/dri2.c | 4 ++++ src/glx/dri2_glx.c | 8 ++++++++ src/glx/dri_common.c | 2 ++ src/glx/glxext.c | 12 +++++++++--- src/mesa/drivers/dri/swrast/swrast.c | 1 + 6 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 070e7c1d8b..ec35d9b772 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -788,6 +788,7 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp) */ dri2_dpy->vtbl = &dri2_drm_display_vtbl; + fprintf(stderr, "---> EGL_TRUE\n"); return EGL_TRUE; cleanup: diff --git a/src/glx/dri2.c b/src/glx/dri2.c index f00b96525a..317d0b3634 100644 --- a/src/glx/dri2.c +++ b/src/glx/dri2.c @@ -299,7 +299,11 @@ DRI2Connect(Display * dpy, XID window, char **driverName, char **deviceName) return False; } + fprintf(stderr, "rep.length: %lu\n", rep.length); + fprintf(stderr, "rep.type: %x\n", rep.type); + if (rep.driverNameLength == 0 && rep.deviceNameLength == 0) { + fprintf(stderr, "Bad driver info...\n"); UnlockDisplay(dpy); SyncHandle(); return False; diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 91afc33750..d16dd68450 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -1219,10 +1219,16 @@ dri2CreateScreen(int screen, struct glx_display * priv) return NULL; } + fprintf(stderr, "dri2CreateDrawable: %d\n", screen); + if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), &driverName, &deviceName)) { glx_screen_cleanup(&psc->base); free(psc); + + fprintf(stderr, "deviceName: %s\n", deviceName); + fprintf(stderr, "driverName: %s\n", driverName); + /* InfoMessageF("---> DRIVER: %n\n", deviceName); */ InfoMessageF("screen %d does not appear to be DRI2 capable\n", screen); return NULL; } @@ -1435,6 +1441,8 @@ dri2CreateDisplay(Display * dpy) pdp->base.destroyDisplay = dri2DestroyDisplay; pdp->base.createScreen = dri2CreateScreen; + fprintf(stderr, "dri2CreateDisplay()\n"); + i = 0; if (pdp->driMinor < 1) pdp->loader_extensions[i++] = &dri2LoaderExtension_old.base; diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c index ab5d6c5bc0..167cfb2a52 100644 --- a/src/glx/dri_common.c +++ b/src/glx/dri_common.c @@ -97,6 +97,8 @@ dri_message(int level, const char *f, ...) _X_HIDDEN void * driOpenDriver(const char *driverName) { + fprintf(stderr, "---> driOpenDriver(): %s\n", driverName); + void *glhandle, *handle; const char *libPaths, *p, *next; char realDriverName[200]; diff --git a/src/glx/glxext.c b/src/glx/glxext.c index 5f23d3717a..889dd086f3 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -819,10 +819,14 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) if (priv->dri3Display) psc = (*priv->dri3Display->createScreen) (i, priv); #endif /* HAVE_DRI3 */ - if (psc == NULL && priv->dri2Display) + if (psc == NULL && priv->dri2Display) { psc = (*priv->dri2Display->createScreen) (i, priv); - if (psc == NULL && priv->driDisplay) + fprintf(stderr, "... checking dri2Display\n"); + } + if (psc == NULL && priv->driDisplay) { + fprintf(stderr, "... checking driDisplay\n"); psc = (*priv->driDisplay->createScreen) (i, priv); + } #endif /* GLX_USE_DRM */ #ifdef GLX_USE_WINDOWSGL @@ -830,8 +834,10 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv) psc = (*priv->windowsdriDisplay->createScreen) (i, priv); #endif - if (psc == NULL && priv->driswDisplay) + if (psc == NULL && priv->driswDisplay) { + fprintf(stderr, "... checking driswDisplay\n"); psc = (*priv->driswDisplay->createScreen) (i, priv); + } #endif /* GLX_DIRECT_RENDERING && !GLX_USE_APPLEGL */ #if defined(GLX_USE_APPLEGL) diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index a88ece97f3..b492e419e0 100644 --- a/src/mesa/drivers/dri/swrast/swrast.c +++ b/src/mesa/drivers/dri/swrast/swrast.c @@ -692,6 +692,7 @@ get_string(struct gl_context *ctx, GLenum pname) case GL_VENDOR: return (const GLubyte *) swrast_vendor_string; case GL_RENDERER: + fprintf(stderr, "$$ HAHA getting string from swrast driver\n"); return (const GLubyte *) swrast_renderer_string; default: return NULL;