Commit a74feb65 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-vc4-next-2016-10-06' of https://github.com/anholt/linux into drm-next

This pull request brings in several fixes for drm-next, mostly for
HDMI.

* tag 'drm-vc4-next-2016-10-06' of https://github.com/anholt/linux:
  drm/vc4: Add support for double-clocked modes.
  drm/vc4: Set up the AVI and SPD infoframes.
  drm/vc4: Fix support for interlaced modes on HDMI.
  drm/vc4: Increase timeout for HDMI_SCHEDULER_CONTROL changes.
  drm/vc4: Fall back to using an EDID probe in the absence of a GPIO.
  drm/vc4: Enable limited range RGB output on HDMI with CEA modes.
  drm/vc4: Fix races when the CS reads from render targets.
  drm/vc4: cleanup with list_first_entry_or_null()
parents c2cbc38b dfccd937
...@@ -229,7 +229,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id, ...@@ -229,7 +229,7 @@ int vc4_crtc_get_scanoutpos(struct drm_device *dev, unsigned int crtc_id,
* and need to make things up in a approximative but consistent way. * and need to make things up in a approximative but consistent way.
*/ */
ret |= DRM_SCANOUTPOS_IN_VBLANK; ret |= DRM_SCANOUTPOS_IN_VBLANK;
vblank_lines = mode->crtc_vtotal - mode->crtc_vdisplay; vblank_lines = mode->vtotal - mode->vdisplay;
if (flags & DRM_CALLED_FROM_VBLIRQ) { if (flags & DRM_CALLED_FROM_VBLIRQ) {
/* /*
...@@ -378,7 +378,7 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc) ...@@ -378,7 +378,7 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
struct drm_crtc_state *state = crtc->state; struct drm_crtc_state *state = crtc->state;
struct drm_display_mode *mode = &state->adjusted_mode; struct drm_display_mode *mode = &state->adjusted_mode;
bool interlace = mode->flags & DRM_MODE_FLAG_INTERLACE; bool interlace = mode->flags & DRM_MODE_FLAG_INTERLACE;
u32 vactive = (mode->vdisplay >> (interlace ? 1 : 0)); u32 pixel_rep = (mode->flags & DRM_MODE_FLAG_DBLCLK) ? 2 : 1;
u32 format = PV_CONTROL_FORMAT_24; u32 format = PV_CONTROL_FORMAT_24;
bool debug_dump_regs = false; bool debug_dump_regs = false;
int clock_select = vc4_get_clock_select(crtc); int clock_select = vc4_get_clock_select(crtc);
...@@ -394,47 +394,65 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc) ...@@ -394,47 +394,65 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
CRTC_WRITE(PV_CONTROL, 0); CRTC_WRITE(PV_CONTROL, 0);
CRTC_WRITE(PV_HORZA, CRTC_WRITE(PV_HORZA,
VC4_SET_FIELD(mode->htotal - mode->hsync_end, VC4_SET_FIELD((mode->htotal -
mode->hsync_end) * pixel_rep,
PV_HORZA_HBP) | PV_HORZA_HBP) |
VC4_SET_FIELD(mode->hsync_end - mode->hsync_start, VC4_SET_FIELD((mode->hsync_end -
mode->hsync_start) * pixel_rep,
PV_HORZA_HSYNC)); PV_HORZA_HSYNC));
CRTC_WRITE(PV_HORZB, CRTC_WRITE(PV_HORZB,
VC4_SET_FIELD(mode->hsync_start - mode->hdisplay, VC4_SET_FIELD((mode->hsync_start -
mode->hdisplay) * pixel_rep,
PV_HORZB_HFP) | PV_HORZB_HFP) |
VC4_SET_FIELD(mode->hdisplay, PV_HORZB_HACTIVE)); VC4_SET_FIELD(mode->hdisplay * pixel_rep, PV_HORZB_HACTIVE));
CRTC_WRITE(PV_VERTA, CRTC_WRITE(PV_VERTA,
VC4_SET_FIELD(mode->vtotal - mode->vsync_end, VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
PV_VERTA_VBP) | PV_VERTA_VBP) |
VC4_SET_FIELD(mode->vsync_end - mode->vsync_start, VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
PV_VERTA_VSYNC)); PV_VERTA_VSYNC));
CRTC_WRITE(PV_VERTB, CRTC_WRITE(PV_VERTB,
VC4_SET_FIELD(mode->vsync_start - mode->vdisplay, VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay,
PV_VERTB_VFP) | PV_VERTB_VFP) |
VC4_SET_FIELD(vactive, PV_VERTB_VACTIVE)); VC4_SET_FIELD(mode->crtc_vdisplay, PV_VERTB_VACTIVE));
if (interlace) { if (interlace) {
CRTC_WRITE(PV_VERTA_EVEN, CRTC_WRITE(PV_VERTA_EVEN,
VC4_SET_FIELD(mode->vtotal - mode->vsync_end - 1, VC4_SET_FIELD(mode->crtc_vtotal -
mode->crtc_vsync_end - 1,
PV_VERTA_VBP) | PV_VERTA_VBP) |
VC4_SET_FIELD(mode->vsync_end - mode->vsync_start, VC4_SET_FIELD(mode->crtc_vsync_end -
mode->crtc_vsync_start,
PV_VERTA_VSYNC)); PV_VERTA_VSYNC));
CRTC_WRITE(PV_VERTB_EVEN, CRTC_WRITE(PV_VERTB_EVEN,
VC4_SET_FIELD(mode->vsync_start - mode->vdisplay, VC4_SET_FIELD(mode->crtc_vsync_start -
mode->crtc_vdisplay,
PV_VERTB_VFP) | PV_VERTB_VFP) |
VC4_SET_FIELD(vactive, PV_VERTB_VACTIVE)); VC4_SET_FIELD(mode->crtc_vdisplay, PV_VERTB_VACTIVE));
/* We set up first field even mode for HDMI. VEC's
* NTSC mode would want first field odd instead, once
* we support it (to do so, set ODD_FIRST and put the
* delay in VSYNCD_EVEN instead).
*/
CRTC_WRITE(PV_V_CONTROL,
PV_VCONTROL_CONTINUOUS |
PV_VCONTROL_INTERLACE |
VC4_SET_FIELD(mode->htotal * pixel_rep / 2,
PV_VCONTROL_ODD_DELAY));
CRTC_WRITE(PV_VSYNCD_EVEN, 0);
} else {
CRTC_WRITE(PV_V_CONTROL, PV_VCONTROL_CONTINUOUS);
} }
CRTC_WRITE(PV_HACT_ACT, mode->hdisplay); CRTC_WRITE(PV_HACT_ACT, mode->hdisplay * pixel_rep);
CRTC_WRITE(PV_V_CONTROL,
PV_VCONTROL_CONTINUOUS |
(interlace ? PV_VCONTROL_INTERLACE : 0));
CRTC_WRITE(PV_CONTROL, CRTC_WRITE(PV_CONTROL,
VC4_SET_FIELD(format, PV_CONTROL_FORMAT) | VC4_SET_FIELD(format, PV_CONTROL_FORMAT) |
VC4_SET_FIELD(vc4_get_fifo_full_level(format), VC4_SET_FIELD(vc4_get_fifo_full_level(format),
PV_CONTROL_FIFO_LEVEL) | PV_CONTROL_FIFO_LEVEL) |
VC4_SET_FIELD(pixel_rep - 1, PV_CONTROL_PIXEL_REP) |
PV_CONTROL_CLR_AT_START | PV_CONTROL_CLR_AT_START |
PV_CONTROL_TRIGGER_UNDERFLOW | PV_CONTROL_TRIGGER_UNDERFLOW |
PV_CONTROL_WAIT_HSTART | PV_CONTROL_WAIT_HSTART |
...@@ -544,16 +562,6 @@ static bool vc4_crtc_mode_fixup(struct drm_crtc *crtc, ...@@ -544,16 +562,6 @@ static bool vc4_crtc_mode_fixup(struct drm_crtc *crtc,
return false; return false;
} }
/*
* Interlaced video modes got CRTC_INTERLACE_HALVE_V applied when
* coming from user space. We don't want this, as it screws up
* vblank timestamping, so fix it up.
*/
drm_mode_set_crtcinfo(adjusted_mode, 0);
DRM_DEBUG_KMS("[CRTC:%d] adjusted_mode :\n", crtc->base.id);
drm_mode_debug_printmodeline(adjusted_mode);
return true; return true;
} }
......
...@@ -122,9 +122,16 @@ to_vc4_dev(struct drm_device *dev) ...@@ -122,9 +122,16 @@ to_vc4_dev(struct drm_device *dev)
struct vc4_bo { struct vc4_bo {
struct drm_gem_cma_object base; struct drm_gem_cma_object base;
/* seqno of the last job to render to this BO. */ /* seqno of the last job to render using this BO. */
uint64_t seqno; uint64_t seqno;
/* seqno of the last job to use the RCL to write to this BO.
*
* Note that this doesn't include binner overflow memory
* writes.
*/
uint64_t write_seqno;
/* List entry for the BO's position in either /* List entry for the BO's position in either
* vc4_exec_info->unref_list or vc4_dev->bo_cache.time_list * vc4_exec_info->unref_list or vc4_dev->bo_cache.time_list
*/ */
...@@ -216,6 +223,9 @@ struct vc4_exec_info { ...@@ -216,6 +223,9 @@ struct vc4_exec_info {
/* Sequence number for this bin/render job. */ /* Sequence number for this bin/render job. */
uint64_t seqno; uint64_t seqno;
/* Latest write_seqno of any BO that binning depends on. */
uint64_t bin_dep_seqno;
/* Last current addresses the hardware was processing when the /* Last current addresses the hardware was processing when the
* hangcheck timer checked on us. * hangcheck timer checked on us.
*/ */
...@@ -230,6 +240,13 @@ struct vc4_exec_info { ...@@ -230,6 +240,13 @@ struct vc4_exec_info {
struct drm_gem_cma_object **bo; struct drm_gem_cma_object **bo;
uint32_t bo_count; uint32_t bo_count;
/* List of BOs that are being written by the RCL. Other than
* the binner temporary storage, this is all the BOs written
* by the job.
*/
struct drm_gem_cma_object *rcl_write_bo[4];
uint32_t rcl_write_bo_count;
/* Pointers for our position in vc4->job_list */ /* Pointers for our position in vc4->job_list */
struct list_head head; struct list_head head;
...@@ -307,18 +324,15 @@ struct vc4_exec_info { ...@@ -307,18 +324,15 @@ struct vc4_exec_info {
static inline struct vc4_exec_info * static inline struct vc4_exec_info *
vc4_first_bin_job(struct vc4_dev *vc4) vc4_first_bin_job(struct vc4_dev *vc4)
{ {
if (list_empty(&vc4->bin_job_list)) return list_first_entry_or_null(&vc4->bin_job_list,
return NULL; struct vc4_exec_info, head);
return list_first_entry(&vc4->bin_job_list, struct vc4_exec_info, head);
} }
static inline struct vc4_exec_info * static inline struct vc4_exec_info *
vc4_first_render_job(struct vc4_dev *vc4) vc4_first_render_job(struct vc4_dev *vc4)
{ {
if (list_empty(&vc4->render_job_list)) return list_first_entry_or_null(&vc4->render_job_list,
return NULL; struct vc4_exec_info, head);
return list_first_entry(&vc4->render_job_list,
struct vc4_exec_info, head);
} }
static inline struct vc4_exec_info * static inline struct vc4_exec_info *
......
...@@ -467,6 +467,11 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno) ...@@ -467,6 +467,11 @@ vc4_update_bo_seqnos(struct vc4_exec_info *exec, uint64_t seqno)
list_for_each_entry(bo, &exec->unref_list, unref_head) { list_for_each_entry(bo, &exec->unref_list, unref_head) {
bo->seqno = seqno; bo->seqno = seqno;
} }
for (i = 0; i < exec->rcl_write_bo_count; i++) {
bo = to_vc4_bo(&exec->rcl_write_bo[i]->base);
bo->write_seqno = seqno;
}
} }
/* Queues a struct vc4_exec_info for execution. If no job is /* Queues a struct vc4_exec_info for execution. If no job is
...@@ -669,6 +674,14 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) ...@@ -669,6 +674,14 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
goto fail; goto fail;
ret = vc4_validate_shader_recs(dev, exec); ret = vc4_validate_shader_recs(dev, exec);
if (ret)
goto fail;
/* Block waiting on any previous rendering into the CS's VBO,
* IB, or textures, so that pixels are actually written by the
* time we try to read them.
*/
ret = vc4_wait_for_seqno(dev, exec->bin_dep_seqno, ~0ull, true);
fail: fail:
drm_free_large(temp); drm_free_large(temp);
......
This diff is collapsed.
...@@ -175,6 +175,8 @@ ...@@ -175,6 +175,8 @@
# define PV_CONTROL_CLR_AT_START BIT(14) # define PV_CONTROL_CLR_AT_START BIT(14)
# define PV_CONTROL_TRIGGER_UNDERFLOW BIT(13) # define PV_CONTROL_TRIGGER_UNDERFLOW BIT(13)
# define PV_CONTROL_WAIT_HSTART BIT(12) # define PV_CONTROL_WAIT_HSTART BIT(12)
# define PV_CONTROL_PIXEL_REP_MASK VC4_MASK(5, 4)
# define PV_CONTROL_PIXEL_REP_SHIFT 4
# define PV_CONTROL_CLK_SELECT_DSI_VEC 0 # define PV_CONTROL_CLK_SELECT_DSI_VEC 0
# define PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI 1 # define PV_CONTROL_CLK_SELECT_DPI_SMI_HDMI 1
# define PV_CONTROL_CLK_SELECT_MASK VC4_MASK(3, 2) # define PV_CONTROL_CLK_SELECT_MASK VC4_MASK(3, 2)
...@@ -183,6 +185,9 @@ ...@@ -183,6 +185,9 @@
# define PV_CONTROL_EN BIT(0) # define PV_CONTROL_EN BIT(0)
#define PV_V_CONTROL 0x04 #define PV_V_CONTROL 0x04
# define PV_VCONTROL_ODD_DELAY_MASK VC4_MASK(22, 6)
# define PV_VCONTROL_ODD_DELAY_SHIFT 6
# define PV_VCONTROL_ODD_FIRST BIT(5)
# define PV_VCONTROL_INTERLACE BIT(4) # define PV_VCONTROL_INTERLACE BIT(4)
# define PV_VCONTROL_CONTINUOUS BIT(1) # define PV_VCONTROL_CONTINUOUS BIT(1)
# define PV_VCONTROL_VIDEN BIT(0) # define PV_VCONTROL_VIDEN BIT(0)
...@@ -438,6 +443,8 @@ ...@@ -438,6 +443,8 @@
#define VC4_HDMI_RAM_PACKET_CONFIG 0x0a0 #define VC4_HDMI_RAM_PACKET_CONFIG 0x0a0
# define VC4_HDMI_RAM_PACKET_ENABLE BIT(16) # define VC4_HDMI_RAM_PACKET_ENABLE BIT(16)
#define VC4_HDMI_RAM_PACKET_STATUS 0x0a4
#define VC4_HDMI_HORZA 0x0c4 #define VC4_HDMI_HORZA 0x0c4
# define VC4_HDMI_HORZA_VPOS BIT(14) # define VC4_HDMI_HORZA_VPOS BIT(14)
# define VC4_HDMI_HORZA_HPOS BIT(13) # define VC4_HDMI_HORZA_HPOS BIT(13)
...@@ -499,6 +506,9 @@ ...@@ -499,6 +506,9 @@
#define VC4_HDMI_TX_PHY_RESET_CTL 0x2c0 #define VC4_HDMI_TX_PHY_RESET_CTL 0x2c0
#define VC4_HDMI_GCP_0 0x400
#define VC4_HDMI_PACKET_STRIDE 0x24
#define VC4_HD_M_CTL 0x00c #define VC4_HD_M_CTL 0x00c
# define VC4_HD_M_REGISTER_FILE_STANDBY (3 << 6) # define VC4_HD_M_REGISTER_FILE_STANDBY (3 << 6)
# define VC4_HD_M_RAM_STANDBY (3 << 4) # define VC4_HD_M_RAM_STANDBY (3 << 4)
...@@ -528,10 +538,17 @@ ...@@ -528,10 +538,17 @@
# define VC4_HD_CSC_CTL_MODE_SHIFT 2 # define VC4_HD_CSC_CTL_MODE_SHIFT 2
# define VC4_HD_CSC_CTL_MODE_RGB_TO_SD_YPRPB 0 # define VC4_HD_CSC_CTL_MODE_RGB_TO_SD_YPRPB 0
# define VC4_HD_CSC_CTL_MODE_RGB_TO_HD_YPRPB 1 # define VC4_HD_CSC_CTL_MODE_RGB_TO_HD_YPRPB 1
# define VC4_HD_CSC_CTL_MODE_CUSTOM 2 # define VC4_HD_CSC_CTL_MODE_CUSTOM 3
# define VC4_HD_CSC_CTL_RGB2YCC BIT(1) # define VC4_HD_CSC_CTL_RGB2YCC BIT(1)
# define VC4_HD_CSC_CTL_ENABLE BIT(0) # define VC4_HD_CSC_CTL_ENABLE BIT(0)
#define VC4_HD_CSC_12_11 0x044
#define VC4_HD_CSC_14_13 0x048
#define VC4_HD_CSC_22_21 0x04c
#define VC4_HD_CSC_24_23 0x050
#define VC4_HD_CSC_32_31 0x054
#define VC4_HD_CSC_34_33 0x058
#define VC4_HD_FRAME_COUNT 0x068 #define VC4_HD_FRAME_COUNT 0x068
/* HVS display list information. */ /* HVS display list information. */
......
...@@ -45,6 +45,8 @@ struct vc4_rcl_setup { ...@@ -45,6 +45,8 @@ struct vc4_rcl_setup {
struct drm_gem_cma_object *rcl; struct drm_gem_cma_object *rcl;
u32 next_offset; u32 next_offset;
u32 next_write_bo_index;
}; };
static inline void rcl_u8(struct vc4_rcl_setup *setup, u8 val) static inline void rcl_u8(struct vc4_rcl_setup *setup, u8 val)
...@@ -407,6 +409,8 @@ static int vc4_rcl_msaa_surface_setup(struct vc4_exec_info *exec, ...@@ -407,6 +409,8 @@ static int vc4_rcl_msaa_surface_setup(struct vc4_exec_info *exec,
if (!*obj) if (!*obj)
return -EINVAL; return -EINVAL;
exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj;
if (surf->offset & 0xf) { if (surf->offset & 0xf) {
DRM_ERROR("MSAA write must be 16b aligned.\n"); DRM_ERROR("MSAA write must be 16b aligned.\n");
return -EINVAL; return -EINVAL;
...@@ -417,7 +421,8 @@ static int vc4_rcl_msaa_surface_setup(struct vc4_exec_info *exec, ...@@ -417,7 +421,8 @@ static int vc4_rcl_msaa_surface_setup(struct vc4_exec_info *exec,
static int vc4_rcl_surface_setup(struct vc4_exec_info *exec, static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
struct drm_gem_cma_object **obj, struct drm_gem_cma_object **obj,
struct drm_vc4_submit_rcl_surface *surf) struct drm_vc4_submit_rcl_surface *surf,
bool is_write)
{ {
uint8_t tiling = VC4_GET_FIELD(surf->bits, uint8_t tiling = VC4_GET_FIELD(surf->bits,
VC4_LOADSTORE_TILE_BUFFER_TILING); VC4_LOADSTORE_TILE_BUFFER_TILING);
...@@ -440,6 +445,9 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec, ...@@ -440,6 +445,9 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
if (!*obj) if (!*obj)
return -EINVAL; return -EINVAL;
if (is_write)
exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj;
if (surf->flags & VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES) { if (surf->flags & VC4_SUBMIT_RCL_SURFACE_READ_IS_FULL_RES) {
if (surf == &exec->args->zs_write) { if (surf == &exec->args->zs_write) {
DRM_ERROR("general zs write may not be a full-res.\n"); DRM_ERROR("general zs write may not be a full-res.\n");
...@@ -542,6 +550,8 @@ vc4_rcl_render_config_surface_setup(struct vc4_exec_info *exec, ...@@ -542,6 +550,8 @@ vc4_rcl_render_config_surface_setup(struct vc4_exec_info *exec,
if (!*obj) if (!*obj)
return -EINVAL; return -EINVAL;
exec->rcl_write_bo[exec->rcl_write_bo_count++] = *obj;
if (tiling > VC4_TILING_FORMAT_LT) { if (tiling > VC4_TILING_FORMAT_LT) {
DRM_ERROR("Bad tiling format\n"); DRM_ERROR("Bad tiling format\n");
return -EINVAL; return -EINVAL;
...@@ -599,15 +609,18 @@ int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec) ...@@ -599,15 +609,18 @@ int vc4_get_rcl(struct drm_device *dev, struct vc4_exec_info *exec)
if (ret) if (ret)
return ret; return ret;
ret = vc4_rcl_surface_setup(exec, &setup.color_read, &args->color_read); ret = vc4_rcl_surface_setup(exec, &setup.color_read, &args->color_read,
false);
if (ret) if (ret)
return ret; return ret;
ret = vc4_rcl_surface_setup(exec, &setup.zs_read, &args->zs_read); ret = vc4_rcl_surface_setup(exec, &setup.zs_read, &args->zs_read,
false);
if (ret) if (ret)
return ret; return ret;
ret = vc4_rcl_surface_setup(exec, &setup.zs_write, &args->zs_write); ret = vc4_rcl_surface_setup(exec, &setup.zs_write, &args->zs_write,
true);
if (ret) if (ret)
return ret; return ret;
......
...@@ -267,6 +267,9 @@ validate_indexed_prim_list(VALIDATE_ARGS) ...@@ -267,6 +267,9 @@ validate_indexed_prim_list(VALIDATE_ARGS)
if (!ib) if (!ib)
return -EINVAL; return -EINVAL;
exec->bin_dep_seqno = max(exec->bin_dep_seqno,
to_vc4_bo(&ib->base)->write_seqno);
if (offset > ib->base.size || if (offset > ib->base.size ||
(ib->base.size - offset) / index_size < length) { (ib->base.size - offset) / index_size < length) {
DRM_ERROR("IB access overflow (%d + %d*%d > %zd)\n", DRM_ERROR("IB access overflow (%d + %d*%d > %zd)\n",
...@@ -555,8 +558,7 @@ static bool ...@@ -555,8 +558,7 @@ static bool
reloc_tex(struct vc4_exec_info *exec, reloc_tex(struct vc4_exec_info *exec,
void *uniform_data_u, void *uniform_data_u,
struct vc4_texture_sample_info *sample, struct vc4_texture_sample_info *sample,
uint32_t texture_handle_index) uint32_t texture_handle_index, bool is_cs)
{ {
struct drm_gem_cma_object *tex; struct drm_gem_cma_object *tex;
uint32_t p0 = *(uint32_t *)(uniform_data_u + sample->p_offset[0]); uint32_t p0 = *(uint32_t *)(uniform_data_u + sample->p_offset[0]);
...@@ -714,6 +716,11 @@ reloc_tex(struct vc4_exec_info *exec, ...@@ -714,6 +716,11 @@ reloc_tex(struct vc4_exec_info *exec,
*validated_p0 = tex->paddr + p0; *validated_p0 = tex->paddr + p0;
if (is_cs) {
exec->bin_dep_seqno = max(exec->bin_dep_seqno,
to_vc4_bo(&tex->base)->write_seqno);
}
return true; return true;
fail: fail:
DRM_INFO("Texture p0 at %d: 0x%08x\n", sample->p_offset[0], p0); DRM_INFO("Texture p0 at %d: 0x%08x\n", sample->p_offset[0], p0);
...@@ -835,7 +842,8 @@ validate_gl_shader_rec(struct drm_device *dev, ...@@ -835,7 +842,8 @@ validate_gl_shader_rec(struct drm_device *dev,
if (!reloc_tex(exec, if (!reloc_tex(exec,
uniform_data_u, uniform_data_u,
&validated_shader->texture_samples[tex], &validated_shader->texture_samples[tex],
texture_handles_u[tex])) { texture_handles_u[tex],
i == 2)) {
return -EINVAL; return -EINVAL;
} }
} }
...@@ -867,6 +875,9 @@ validate_gl_shader_rec(struct drm_device *dev, ...@@ -867,6 +875,9 @@ validate_gl_shader_rec(struct drm_device *dev,
uint32_t stride = *(uint8_t *)(pkt_u + o + 5); uint32_t stride = *(uint8_t *)(pkt_u + o + 5);
uint32_t max_index; uint32_t max_index;
exec->bin_dep_seqno = max(exec->bin_dep_seqno,
to_vc4_bo(&vbo->base)->write_seqno);
if (state->addr & 0x8) if (state->addr & 0x8)
stride |= (*(uint32_t *)(pkt_u + 100 + i * 4)) & ~0xff; stride |= (*(uint32_t *)(pkt_u + 100 + i * 4)) & ~0xff;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment