summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_context.c4
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_image.c33
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_image.h2
-rw-r--r--src/gallium/drivers/freedreno/freedreno_state.c2
-rw-r--r--src/gallium/drivers/freedreno/freedreno_state.h5
5 files changed, 45 insertions, 1 deletions
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.c b/src/gallium/drivers/freedreno/a6xx/fd6_context.c
index 4f696ef092c..d16fbea6c6c 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_context.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.c
@@ -34,6 +34,7 @@
#include "fd6_draw.h"
#include "fd6_emit.h"
#include "fd6_gmem.h"
+#include "fd6_image.h"
#include "fd6_program.h"
#include "fd6_query.h"
#include "fd6_rasterizer.h"
@@ -105,6 +106,9 @@ fd6_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
if (!pctx)
return NULL;
+ /* after fd_context_init() to override set_shader_images() */
+ fd6_image_init(pctx);
+
util_blitter_set_texture_multisample(fd6_ctx->base.blitter, true);
/* fd_context_init overwrites delete_rasterizer_state, so set this
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_image.c b/src/gallium/drivers/freedreno/a6xx/fd6_image.c
index 51ea438b672..3b476440856 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_image.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_image.c
@@ -28,8 +28,11 @@
#include "pipe/p_state.h"
#include "freedreno_resource.h"
+#include "freedreno_state.h"
+
#include "fd6_image.h"
#include "fd6_format.h"
+#include "fd6_resource.h"
#include "fd6_texture.h"
struct fd6_image {
@@ -301,3 +304,33 @@ fd6_build_ibo_state(struct fd_context *ctx, const struct ir3_shader_variant *v,
return state;
}
+
+static void fd6_set_shader_images(struct pipe_context *pctx,
+ enum pipe_shader_type shader,
+ unsigned start, unsigned count,
+ const struct pipe_image_view *images)
+{
+ struct fd_context *ctx = fd_context(pctx);
+ struct fd_shaderimg_stateobj *so = &ctx->shaderimg[shader];
+
+ fd_set_shader_images(pctx, shader, start, count, images);
+
+ if (!images)
+ return;
+
+ for (unsigned i = 0; i < count; i++) {
+ unsigned n = i + start;
+ struct pipe_image_view *buf = &so->si[n];
+
+ if (!buf->resource)
+ continue;
+
+ fd6_validate_format(ctx, fd_resource(buf->resource), buf->format);
+ }
+}
+
+void
+fd6_image_init(struct pipe_context *pctx)
+{
+ pctx->set_shader_images = fd6_set_shader_images;
+}
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_image.h b/src/gallium/drivers/freedreno/a6xx/fd6_image.h
index a2dbfd3c1a8..c11b38a0233 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_image.h
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_image.h
@@ -37,4 +37,6 @@ struct ir3_shader_variant;
struct fd_ringbuffer * fd6_build_ibo_state(struct fd_context *ctx,
const struct ir3_shader_variant *v, enum pipe_shader_type shader);
+void fd6_image_init(struct pipe_context *pctx);
+
#endif /* FD6_IMAGE_H_ */
diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c
index 8bf51bee615..238efd44899 100644
--- a/src/gallium/drivers/freedreno/freedreno_state.c
+++ b/src/gallium/drivers/freedreno/freedreno_state.c
@@ -165,7 +165,7 @@ fd_set_shader_buffers(struct pipe_context *pctx,
ctx->dirty_shader[shader] |= FD_DIRTY_SHADER_SSBO;
}
-static void
+void
fd_set_shader_images(struct pipe_context *pctx,
enum pipe_shader_type shader,
unsigned start, unsigned count,
diff --git a/src/gallium/drivers/freedreno/freedreno_state.h b/src/gallium/drivers/freedreno/freedreno_state.h
index ad2c4943ec8..0d8d3368ad4 100644
--- a/src/gallium/drivers/freedreno/freedreno_state.h
+++ b/src/gallium/drivers/freedreno/freedreno_state.h
@@ -55,6 +55,11 @@ static inline bool fd_blend_enabled(struct fd_context *ctx, unsigned n)
return ctx->blend && ctx->blend->rt[n].blend_enable;
}
+void fd_set_shader_images(struct pipe_context *pctx,
+ enum pipe_shader_type shader,
+ unsigned start, unsigned count,
+ const struct pipe_image_view *images);
+
void fd_state_init(struct pipe_context *pctx);
#endif /* FREEDRENO_STATE_H_ */