projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
v3d: Fix Z clipping when viewport.scale[2] is negative.
[mesa.git]
/
src
/
gallium
/
drivers
/
vc4
/
vc4_resource.c
diff --git
a/src/gallium/drivers/vc4/vc4_resource.c
b/src/gallium/drivers/vc4/vc4_resource.c
index 2018dc36d93bf109b2ab4e7f712822d2d93c08cb..3ea45ba080b31f16dffd24c921f3b1c1e005d60a 100644
(file)
--- a/
src/gallium/drivers/vc4/vc4_resource.c
+++ b/
src/gallium/drivers/vc4/vc4_resource.c
@@
-22,6
+22,7
@@
* IN THE SOFTWARE.
*/
* IN THE SOFTWARE.
*/
+#include "pipe/p_defines.h"
#include "util/u_blit.h"
#include "util/u_memory.h"
#include "util/u_format.h"
#include "util/u_blit.h"
#include "util/u_memory.h"
#include "util/u_format.h"
@@
-36,10
+37,6
@@
#include "vc4_resource.h"
#include "vc4_tiling.h"
#include "vc4_resource.h"
#include "vc4_tiling.h"
-#ifndef DRM_FORMAT_MOD_INVALID
-#define DRM_FORMAT_MOD_INVALID ((1ULL << 56) - 1)
-#endif
-
static bool
vc4_resource_bo_alloc(struct vc4_resource *rsc)
{
static bool
vc4_resource_bo_alloc(struct vc4_resource *rsc)
{
@@
-373,7
+370,6
@@
vc4_resource_destroy(struct pipe_screen *pscreen,
{
struct vc4_screen *screen = vc4_screen(pscreen);
struct vc4_resource *rsc = vc4_resource(prsc);
{
struct vc4_screen *screen = vc4_screen(pscreen);
struct vc4_resource *rsc = vc4_resource(prsc);
- pipe_resource_reference(&rsc->shadow_parent, NULL);
vc4_bo_unreference(&rsc->bo);
if (rsc->scanout)
vc4_bo_unreference(&rsc->bo);
if (rsc->scanout)
@@
-407,7
+403,7
@@
vc4_resource_get_handle(struct pipe_screen *pscreen,
whandle->modifier = DRM_FORMAT_MOD_LINEAR;
switch (whandle->type) {
whandle->modifier = DRM_FORMAT_MOD_LINEAR;
switch (whandle->type) {
- case
DRM_API
_HANDLE_TYPE_SHARED:
+ case
WINSYS
_HANDLE_TYPE_SHARED:
if (screen->ro) {
/* This could probably be supported, assuming that a
* control node was used for pl111.
if (screen->ro) {
/* This could probably be supported, assuming that a
* control node was used for pl111.
@@
-417,12
+413,12
@@
vc4_resource_get_handle(struct pipe_screen *pscreen,
}
return vc4_bo_flink(rsc->bo, &whandle->handle);
}
return vc4_bo_flink(rsc->bo, &whandle->handle);
- case
DRM_API
_HANDLE_TYPE_KMS:
+ case
WINSYS
_HANDLE_TYPE_KMS:
if (screen->ro && renderonly_get_handle(rsc->scanout, whandle))
return TRUE;
whandle->handle = rsc->bo->handle;
return TRUE;
if (screen->ro && renderonly_get_handle(rsc->scanout, whandle))
return TRUE;
whandle->handle = rsc->bo->handle;
return TRUE;
- case
DRM_API
_HANDLE_TYPE_FD:
+ case
WINSYS
_HANDLE_TYPE_FD:
/* FDs are cross-device, so we can export directly from vc4.
*/
whandle->handle = vc4_bo_get_dmabuf(rsc->bo);
/* FDs are cross-device, so we can export directly from vc4.
*/
whandle->handle = vc4_bo_get_dmabuf(rsc->bo);
@@
-565,8
+561,10
@@
get_resource_texture_format(struct pipe_resource *prsc)
if (prsc->nr_samples > 1) {
return ~0;
} else {
if (prsc->nr_samples > 1) {
return ~0;
} else {
- assert(format == VC4_TEXTURE_TYPE_RGBA8888);
- return VC4_TEXTURE_TYPE_RGBA32R;
+ if (format == VC4_TEXTURE_TYPE_RGBA8888)
+ return VC4_TEXTURE_TYPE_RGBA32R;
+ else
+ return ~0;
}
}
}
}
@@
-676,6
+674,11
@@
vc4_resource_create_with_modifiers(struct pipe_screen *pscreen,
goto fail;
}
goto fail;
}
+ vc4_bo_label(screen, rsc->bo, "%sresource %dx%d@%d/%d",
+ (tmpl->bind & PIPE_BIND_SCANOUT) ? "scanout " : "",
+ tmpl->width0, tmpl->height0,
+ rsc->cpp * 8, prsc->last_level);
+
return prsc;
fail:
vc4_resource_destroy(pscreen, prsc);
return prsc;
fail:
vc4_resource_destroy(pscreen, prsc);
@@
-704,19
+707,12
@@
vc4_resource_from_handle(struct pipe_screen *pscreen,
if (!rsc)
return NULL;
if (!rsc)
return NULL;
- if (whandle->offset != 0) {
- fprintf(stderr,
- "Attempt to import unsupported winsys offset %u\n",
- whandle->offset);
- return NULL;
- }
-
switch (whandle->type) {
switch (whandle->type) {
- case
DRM_API
_HANDLE_TYPE_SHARED:
+ case
WINSYS
_HANDLE_TYPE_SHARED:
rsc->bo = vc4_bo_open_name(screen,
whandle->handle, whandle->stride);
break;
rsc->bo = vc4_bo_open_name(screen,
whandle->handle, whandle->stride);
break;
- case
DRM_API
_HANDLE_TYPE_FD:
+ case
WINSYS
_HANDLE_TYPE_FD:
rsc->bo = vc4_bo_open_dmabuf(screen,
whandle->handle, whandle->stride);
break;
rsc->bo = vc4_bo_open_dmabuf(screen,
whandle->handle, whandle->stride);
break;
@@
-762,6
+758,28
@@
vc4_resource_from_handle(struct pipe_screen *pscreen,
rsc->vc4_format = get_resource_texture_format(prsc);
vc4_setup_slices(rsc, "import");
rsc->vc4_format = get_resource_texture_format(prsc);
vc4_setup_slices(rsc, "import");
+ if (whandle->offset != 0) {
+ if (rsc->tiled) {
+ fprintf(stderr,
+ "Attempt to import unsupported "
+ "winsys offset %u\n",
+ whandle->offset);
+ goto fail;
+ }
+
+ rsc->slices[0].offset += whandle->offset;
+
+ if (rsc->slices[0].offset + rsc->slices[0].size >
+ rsc->bo->size) {
+ fprintf(stderr, "Attempt to import "
+ "with overflowing offset (%d + %d > %d)\n",
+ whandle->offset,
+ rsc->slices[0].size,
+ rsc->bo->size);
+ goto fail;
+ }
+ }
+
if (screen->ro) {
/* Make sure that renderonly has a handle to our buffer in the
* display's fd, so that a later renderonly_get_handle()
if (screen->ro) {
/* Make sure that renderonly has a handle to our buffer in the
* display's fd, so that a later renderonly_get_handle()
@@
-775,7
+793,7
@@
vc4_resource_from_handle(struct pipe_screen *pscreen,
goto fail;
}
goto fail;
}
- if (whandle->stride != slice->stride) {
+ if (
rsc->tiled &&
whandle->stride != slice->stride) {
static bool warned = false;
if (!warned) {
warned = true;
static bool warned = false;
if (!warned) {
warned = true;
@@
-788,6
+806,8
@@
vc4_resource_from_handle(struct pipe_screen *pscreen,
slice->stride);
}
goto fail;
slice->stride);
}
goto fail;
+ } else if (!rsc->tiled) {
+ slice->stride = whandle->stride;
}
return prsc;
}
return prsc;
@@
-1078,19
+1098,21
@@
vc4_flush_resource(struct pipe_context *pctx, struct pipe_resource *resource)
void
vc4_update_shadow_baselevel_texture(struct pipe_context *pctx,
void
vc4_update_shadow_baselevel_texture(struct pipe_context *pctx,
- struct pipe_sampler_view *view)
+ struct pipe_sampler_view *
p
view)
{
{
+ struct vc4_sampler_view *view = vc4_sampler_view(pview);
struct vc4_resource *shadow = vc4_resource(view->texture);
struct vc4_resource *shadow = vc4_resource(view->texture);
- struct vc4_resource *orig = vc4_resource(shadow->shadow_parent);
- assert(orig);
+ struct vc4_resource *orig = vc4_resource(pview->texture);
+
+ assert(view->texture != pview->texture);
if (shadow->writes == orig->writes && orig->bo->private)
return;
perf_debug("Updating %dx%d@%d shadow texture due to %s\n",
orig->base.width0, orig->base.height0,
if (shadow->writes == orig->writes && orig->bo->private)
return;
perf_debug("Updating %dx%d@%d shadow texture due to %s\n",
orig->base.width0, orig->base.height0,
- view->u.tex.first_level,
- view->u.tex.first_level ? "base level" : "raster layout");
+
p
view->u.tex.first_level,
+
p
view->u.tex.first_level ? "base level" : "raster layout");
for (int i = 0; i <= shadow->base.last_level; i++) {
unsigned width = u_minify(shadow->base.width0, i);
for (int i = 0; i <= shadow->base.last_level; i++) {
unsigned width = u_minify(shadow->base.width0, i);
@@
-1111,7
+1133,7
@@
vc4_update_shadow_baselevel_texture(struct pipe_context *pctx,
},
.src = {
.resource = &orig->base,
},
.src = {
.resource = &orig->base,
- .level = view->u.tex.first_level + i,
+ .level =
p
view->u.tex.first_level + i,
.box = {
.x = 0,
.y = 0,
.box = {
.x = 0,
.y = 0,